매개 변수로 생성자 모의
다음과 같은 수업이 있습니다.
public class A {
public A(String test) {
bla bla bla
}
public String check() {
bla bla bla
}
}
생성자 의 논리 A(String test)
와 check()
내가 조롱하려는 것입니다. 다음과 같은 호출을 원합니다. new A($$$any string$$$).check()
더미 문자열을 반환합니다 "test"
.
나는 시도했다 :
A a = mock(A.class);
when(a.check()).thenReturn("test");
String test = a.check(); // to this point, everything works. test shows as "tests"
whenNew(A.class).withArguments(Matchers.anyString()).thenReturn(rk);
// also tried:
//whenNew(A.class).withParameterTypes(String.class).withArguments(Matchers.anyString()).thenReturn(rk);
new A("random string").check(); // this doesn't work
그러나 작동하지 않는 것입니다. new A($$$any string$$$).check()
의 모의 객체를 가져 오는 대신 생성자 논리를 계속 진행합니다 A
.
게시 한 코드는 최신 버전의 Mockito 및 Powermockito에서 저에게 적합합니다. A를 준비하지 갑자기 나? 이 시도 :
A.java
public class A {
private final String test;
public A(String test) {
this.test = test;
}
public String check() {
return "checked " + this.test;
}
}
MockA.java
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.equalTo;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mockito;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
@RunWith(PowerMockRunner.class)
@PrepareForTest(A.class)
public class MockA {
@Test
public void test_not_mocked() throws Throwable {
assertThat(new A("random string").check(), equalTo("checked random string"));
}
@Test
public void test_mocked() throws Throwable {
A a = mock(A.class);
when(a.check()).thenReturn("test");
PowerMockito.whenNew(A.class).withArguments(Mockito.anyString()).thenReturn(a);
assertThat(new A("random string").check(), equalTo("test"));
}
}
두 테스트 모두 mockito 1.9.0, powermockito 1.4.12 및 junit 4.8.2를 통과해야합니다.
내가 아는 한, mockito로 생성 할 수있는 방법 만 사용할 수 있습니다. 그러나 Mockito Google 코드 페이지의 위키에 따르면 해당 클래스의 새 인스턴스를 반환하는 메서드를 클래스에 생성하여 생성자 동작을 모의하는 방법이 있습니다. 그런 다음 그 방법을 조롱 할 수 있습니다. 아래는 Mockito 위키에서 직접 발췌 한 것입니다 .
패턴 1- 객체 생성에 한 줄 방법 사용
패턴 1 (MyClass라는 클래스 테스트)을 사용하는 다음과 같은 호출을 대체합니다.
Foo foo = new Foo( a, b, c );
와
Foo foo = makeFoo( a, b, c );
한 줄 방법을 작성하십시오.
Foo makeFoo( A a, B b, C c ) { return new Foo( a, b, c ); }
방법에 논리를 포함하지 않는 것이 중요합니다. 객체를 생성하는 단 한 줄입니다. 그 이유는 메소드 자체가 단위 테스트를 거치지 않습니다.
클래스를 테스트 할 때 테스트하는 개체는 Mockito 스파이가 종료이 메소드는 재정의되어 모의를 반환합니다. 따라서 테스트하는 것은 자체가 약간의 수정 된 버전입니다.
테스트 클래스에는 다음과 같은 멤버가 있습니다.
@Mock private Foo mockFoo; private MyClass toTest = spy(new MyClass());
마지막으로 테스트 메서드 내에서 다음과 같은 줄로 makeFoo 호출을 조롱합니다.
doReturn( mockFoo ) .when( toTest ) .makeFoo( any( A.class ), any( B.class ), any( C.class ));
생성자에 전달되는 전달되는 것을 확인하려는 경우 () 인수보다 구체적인 매처를 사용할 수 있습니다.
클래스의 모의 수업을 반환하고 효과적인 효과가 생각합니다. 어떤 경우 든 여기에서 모의 객체를 생성 할 수 있습니다.
http://code.google.com/p/mockito/wiki/MockingObjectCreation
Powermock을 사용하지 않고 .... Ben Glasser 답변을 기반으로 한 아래 예제를 참조하십시오. .. 시간을 절약하는 희망 ...
원래 수업 :
public class AClazz {
public void updateObject(CClazz cClazzObj) {
log.debug("Bundler set.");
cClazzObj.setBundler(new BClazz(cClazzObj, 10));
}
}
수정 된 클래스 :
@Slf4j
public class AClazz {
public void updateObject(CClazz cClazzObj) {
log.debug("Bundler set.");
cClazzObj.setBundler(getBObject(cClazzObj, 10));
}
protected BClazz getBObject(CClazz cClazzObj, int i) {
return new BClazz(cClazzObj, 10);
}
}
테스트 클래스
public class AClazzTest {
@InjectMocks
@Spy
private AClazz aClazzObj;
@Mock
private CClazz cClazzObj;
@Mock
private BClazz bClassObj;
@Before
public void setUp() throws Exception {
Mockito.doReturn(bClassObj)
.when(aClazzObj)
.getBObject(Mockito.eq(cClazzObj), Mockito.anyInt());
}
@Test
public void testConfigStrategy() {
aClazzObj.updateObject(cClazzObj);
Mockito.verify(cClazzObj, Mockito.times(1)).setBundler(bClassObj);
}
}
Mockito에는 최종, 정적 및 비공개 메서드를 테스트하는 데 제한이 있습니다.
jMockit 테스트 라이브러리를 사용하면 아래와 같이 매우 쉽고 간단하게 몇 가지 작업을 수행 할 수 있습니다.
java.io.File 클래스의 모의 생성자 :
new MockUp<File>(){
@Mock
public void $init(String pathname){
System.out.println(pathname);
// or do whatever you want
}
};
- 공개 생성자 이름은 $ init로 바꿔야합니다.
- 던져진 인수와 예외는 동일하게 유지됩니다.
- 반환 유형은 void로 정의되어야합니다.
정적 메서드 모의 :
- 메서드 모의 서명에서 정적 제거
- 메소드 서명은 그렇지 않으면 동일하게 유지됩니다.
참고 URL : https://stackoverflow.com/questions/13364406/mock-a-constructor-with-parameter
'ProgramingTip' 카테고리의 다른 글
어디에서 소문자 표현으로 어떻게 변환합니까? (0) | 2020.10.21 |
---|---|
크롬 확장에서 현재 페이지의 소스 HTML 가져 오기 오기 (0) | 2020.10.21 |
프로그래밍 방식으로 (법적으로) 거리 주소의 경도와 위도를 얻는 방법 (0) | 2020.10.21 |
2D 다각형의 다음은 어떻게 계산합니까? (0) | 2020.10.21 |
(400) HTTP 잘못된 요청으로 인해 큰 WCF 웹 서비스 요청 실패 함 (0) | 2020.10.21 |