Может ли кто-нибудь предоставить мне пример, показывающий, как использовать org.mockito.ArgumentCaptor
класс и чем он отличается от простых сопоставителей , которые предоставляются с mockito.
Я прочитал предоставленные документы mockito, но они не иллюстрируют это ясно, никто из них не может объяснить это с ясностью.
java
unit-testing
junit
mockito
Удджвал
источник
источник
doSomething(data)
мутируетinnerData
, то будет ли это изменение присутствоватьassertEquals("Some inner data", actual.innerData)
или будетinnerData
зафиксировано как есть передdoSomething
выполнением?OtherClass
- это макет, и, как он определен сейчас, на самом делеdoSomething()
ничего делать не будет, он просто записывает переданный объект. Это означает, что он будет записан как есть передdoSomething
выполнением.verify
,times(1)
по умолчанию и может быть опущено.verify
метод, он использует эту информацию для сопоставления с проверкой, которую вы выполняете. Для каждого параметра он спрашивает, соответствует ли он конкретному проверяемому вызову. Когда установлен флажок ArgumentCaptor, он просто сохраняет значения, с которыми он был вызван, поэтому поverify
завершении он содержит все соответствующие вызовы. Это примерно так, как это работает. Надеюсь, это поможетДва основных отличия:
ArgumentCaptor
может захватить более чем один раз.Чтобы проиллюстрировать последнее, предположим, что у вас есть:
final ArgumentCaptor<Foo> captor = ArgumentCaptor.forClass(Foo.class); verify(x, times(4)).someMethod(captor.capture()); // for instance
Затем захватчик сможет предоставить вам доступ ко всем 4 аргументам, по которым вы затем сможете выполнять утверждения по отдельности.
Фактически, это или любое количество аргументов, поскольку a
VerificationMode
не ограничивается фиксированным количеством вызовов; в любом случае похититель предоставит вам доступ ко всем из них, если вы пожелаете.Это также имеет то преимущество, что такие тесты (imho) намного проще писать, чем реализовывать свои собственные
ArgumentMatcher
s, особенно если вы комбинируете mockito с assertj.О, и, пожалуйста, подумайте об использовании TestNG вместо JUnit.
источник
Шаги для полной проверки:
Подготовьте похитителя:
проверить, что вызов зависит от компонента (соавтора тестируемого объекта) раз (1), является значением по умолчанию, поэтому его необходимо добавить.
verify(dependentOnComponent, times(1)).send(someArgumentCaptor.capture());
times (1) - значение по умолчанию, поэтому добавлять его не нужно.
Передать аргумент соавтору
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)
источник
captor
определено в вашем ответе?