Mockito의 argumentCaptor에 대한 예
누구든지 org.mockito.ArgumentCaptor클래스 사용이 무엇이며 mockito와 함께 제공되는 단순 매처 와 어떻게 다른지 보여주는 예를 제게 제공해 주 시겠습니까?
제공된 mockito 문서를 읽었지만 명확하게 설명하지 못하거나 명확하게 설명 할 수 없습니다.
@fge가 말한 것에 동의합니다. 예를 살펴 보겠습니다. 방법이 있다고 생각하십시오.
class A {
public void foo(OtherClass other) {
SomeData data = new SomeData("Some inner data");
other.doSomething(data);
}
}
이제 내부 데이터를 확인하려면 캡처자를 사용할 수 있습니다.
// Create a mock of the OtherClass
OtherClass other = mock(OtherClass.class);
// Run the foo method with the mock
new A().foo(other);
// Capture the argument of the doSomething function
ArgumentCaptor<SomeData> captor = ArgumentCaptor.forClass(SomeData.class);
verify(other, times(1)).doSomething(captor.capture());
// Assert the argument
SomeData actual = captor.getValue();
assertEquals("Some inner data", actual.innerData);
두 가지 주요 차이점은 다음과 같습니다.
- 단일 인수를 캡처 할 때도이 인수에 대해보다 명확한 코드를 사용하여 훨씬 더 정교한 테스트를 수행 할 수 있습니다.
- 은
ArgumentCaptor캡처 할 수 있습니다 더 번 이상.
후자를 설명하기 위해 다음이 있다고 가정합니다.
final ArgumentCaptor<Foo> captor = ArgumentCaptor.forClass(Foo.class);
verify(x, times(4)).someMethod(captor.capture()); // for instance
그런 다음 캡처자는 4 개의 인수 모두에 대한 액세스 권한을 부여 할 수 있으며, 그런 다음 별도로 주장을 수행 할 수 있습니다.
a VerificationMode는 고정 된 호출 수로 제한되지 않기 때문에 실제로이 또는 임의의 수의 인수입니다 . 어떤 경우에도, 캡터는 원하는 경우 모든 항목에 액세스 할 수 있습니다.
이것은 또한 그러한 테스트가 직접 구현하는 것보다 작성하기가 훨씬 쉽다는 이점이 있습니다. ArgumentMatcher특히 mockito와 assertj를 결합하는 경우에 그렇습니다.
아, JUnit 대신 TestNG를 사용하는 것이 좋습니다.
전체 확인을위한 단계는 다음과 같습니다.
체포 자 준비 :
ArgumentCaptor<SomeArgumentClass> someArgumentCaptor = ArgumentCaptor.forClass(SomeArgumentClass.class);
구성 요소 (테스트 대상의 공동 작업자)에 대한 호출 시간 (1)이 기본값인지 확인하므로 추가해야합니다.
verify(dependentOnComponent, times(1)).send(someArgumentCaptor.capture());
공동 작업자에게 전달 된 인수 가져 오기
SomeArgumentClass someArgument = messageCaptor.getValue();
someArgument는 어설 션에 사용할 수 있습니다.
여기서는 하나의 콜백 메서드에 대한 적절한 예를 제공합니다. 따라서 login () 메소드와 같은 메소드가 있다고 가정하십시오.
public void login() {
loginService = new LoginService();
loginService.login(loginProvider, new LoginListener() {
@Override
public void onLoginSuccess() {
loginService.getresult(true);
}
@Override
public void onLoginFaliure() {
loginService.getresult(false);
}
});
System.out.print("@@##### get called");
}
또한 예제를 더 명확하게하기 위해 여기에 모든 도우미 클래스를 넣었습니다. loginService 클래스
public class LoginService implements Login.getresult{
public void login(LoginProvider loginProvider,LoginListener callback){
String username = loginProvider.getUsername();
String pwd = loginProvider.getPassword();
if(username != null && pwd != null){
callback.onLoginSuccess();
}else{
callback.onLoginFaliure();
}
}
@Override
public void getresult(boolean value) {
System.out.print("login success"+value);
}}
리스너 LoginListener는 다음과 같습니다.
interface LoginListener {
void onLoginSuccess();
void onLoginFaliure();
}
이제 Login 클래스의 login () 메소드를 테스트하고 싶었습니다.
@Test
public void loginTest() throws Exception {
LoginService service = mock(LoginService.class);
LoginProvider provider = mock(LoginProvider.class);
whenNew(LoginProvider.class).withNoArguments().thenReturn(provider);
whenNew(LoginService.class).withNoArguments().thenReturn(service);
when(provider.getPassword()).thenReturn("pwd");
when(provider.getUsername()).thenReturn("username");
login.getLoginDetail("username","password");
verify(provider).setPassword("password");
verify(provider).setUsername("username");
verify(service).login(eq(provider),captor.capture());
LoginListener listener = captor.getValue();
listener.onLoginSuccess();
verify(service).getresult(true);
또한 테스트 클래스 위에 주석을 추가하는 것을 잊지 마십시오.
@RunWith(PowerMockRunner.class)
@PrepareForTest(Login.class)
참고 URL : https://stackoverflow.com/questions/36253040/example-on-mockitos-argumentcaptor
'IT박스' 카테고리의 다른 글
| Linux bash : 다중 변수 할당 (0) | 2020.08.13 |
|---|---|
| PDO 폐쇄 연결 (0) | 2020.08.12 |
| Parse 대 TryParse (0) | 2020.08.12 |
| Python에서 밀리 초에서 날짜 시간을 어떻게 생성합니까? (0) | 2020.08.12 |
| Mercurial에서 커밋을 스쿼시 할 수 있습니까? (0) | 2020.08.12 |