jUnit 및 Mockito로 구현을 테스트하려고하는데 문제가 있습니다. 다음은 "비즈니스 로직"Mockito 인터페이스와 조롱 getter/setter 메서드
public class ValueFinder {
public KeyValueInterface findValueForKey(KeyValueInterface keyValue){
keyValue.setValue("foo");
return keyValue;
}
}
JUnit 테스트 클래스
으로 문제를public interface KeyValueInterface {
public abstract String getKey();
public abstract void setKey(String key);
public abstract String getValue();
public abstract void setValue(String value);
}
클래스 KeyValueImpl
public class KeyValueImpl implements KeyValueInterface {
private String key;
private String value;
@Override
public String getKey() {
return key;
}
@Override
public void setKey(String key) {
this.key = key;
}
@Override
public String getValue() {
return value;
}
@Override
public void setValue(String value) {
this.value = value;
}
}
클래스
인터페이스 KeyValueInterface을 설명하는 매우 간단한 예입니다
import static org.junit.Assert.*;
import org.junit.Test;
import org.mockito.Mockito;
public class ValueFinderTest {
@Test
public void testNotMocked() {
KeyValueInterface keyValue = new KeyValueImpl();
keyValue = (new ValueFinder()).findValueForKey(keyValue);
assertEquals("foo", keyValue.getValue()); // works fine
}
@Test
public void testMocked1() {
KeyValueInterface keyValue = Mockito.mock(KeyValueInterface.class);
keyValue = (new ValueFinder()).findValueForKey(keyValue);
assertEquals("foo", keyValue.getValue()); // java.lang.AssertionError:
// expected:<foo> but
// was:<null>
}
@Test
public void testMocked2() {
KeyValueInterface keyValue = Mockito.mock(KeyValueInterface.class);
keyValue = (new ValueFinder()).findValueForKey(keyValue);
Mockito.when(keyValue.getValue()).thenCallRealMethod();
Mockito.doCallRealMethod().when(keyValue).setValue(Mockito.any(String.class));
assertEquals("foo", keyValue.getValue()); // org.mockito.exceptions.base.MockitoException:
// Cannot call real method
// on java interface.
// Interface does not have
// any implementation!
// Calling real methods is
// only possible when
// mocking concrete classes.
}
}
My probelm은 필자가 통제 할 수없는 기술적 인 이유로 KeyValue를 조롱해야한다는 것입니다. 따라서 메서드 testNotMocked()로 갈 수는 없습니다. 또한 내 제어 할 수없는 기술적 이유 때문에 인터페이스를 조롱해야합니다 (클래스가 아님).
이것을 달성 할 방법이 있습니까?
고마워요.
감사합니다. 스프링 프레임 워크의 ReflectionTestUtils를 의미합니까? – Paul
네,하지만 일반적인 아이디어는 어디서나 동일해야합니다. – vikeng21