매개 변수를 사용하여 생성자 모의
다음과 같은 수업이 있습니다.
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;
}
}
모카자바
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 구글 코드 페이지의 Wiki에 따르면 클래스의 새 인스턴스를 반환하는 메서드를 만들어 생성자의 동작을 조롱하는 방법이 있습니다.그 방법을 조롱할 수 있습니다.다음은 Mockito Wiki에서 직접 발췌한 것입니다.
패턴 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());
마지막으로, 당신의 테스트 방법 안에서 당신은 다음과 같은 선으로 Foo를 만들기 위한 콜을 조롱합니다.
doReturn( mockFoo ) .when( toTest ) .makeFoo( any( A.class ), any( B.class ), any( C.class ));
컨스트럭터에 전달된 인수를 체크하려면 any()보다 구체적인 matcher를 사용할 수 있습니다.
반에서 조롱당한 대상을 돌려보내고 싶다면 이 방법이 좋을 것 같아.어떤 경우에도 오브젝트 작성을 조롱하는 것에 대한 자세한 내용은 여기를 참조하십시오.
http://code.google.com/p/mockito/wiki/MockingObjectCreation
Mockito라면 사용할 수 있습니다.withSettings()
예를 들어,CounterService
2개의 의존관계가 필요합니다.모크로서 전달할 수 있습니다.
UserService userService = Mockito.mock(UserService.class);
SearchService searchService = Mockito.mock(SearchService.class);
CounterService counterService = Mockito.mock(CounterService.class, withSettings().useConstructor(userService, searchService));
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 버전 3.5.0 이후부터InlineMockMaker
, 이제 오브젝트 구성을 모사할 수 있습니다.
try (MockedConstruction mocked = mockConstruction(A.class)) {
A a = new A();
when(a.check()).thenReturn("bar");
}
<고객명>try-with-resources
construction all object constructions가 모크를 반환합니다.
Mockito는 최종, 정적 및 개인 메서드를 테스트하는 데 제한이 있습니다.
jMockit 테스트 라이브러리를 사용하면 다음과 같이 간단하고 간단한 작업을 수행할 수 있습니다.
java.io의 모의 컨스트럭터.파일 클래스:
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
'programing' 카테고리의 다른 글
사용자 지정 지시문을 통해 v-model 속성 값을 수정하는 방법은 무엇입니까? (0) | 2022.09.03 |
---|---|
Vuetify - 페이지 매기는 방법? (0) | 2022.09.03 |
FILE*로 메모리 버퍼에 쓰는 방법 (0) | 2022.09.03 |
정수가 짝수인지 홀수인지 확인하려면 어떻게 해야 하나요? (0) | 2022.09.03 |
Java 동적 어레이 크기 (0) | 2022.09.03 |