2016-03-27 1 views
28

Может ли кто-нибудь указать мне пример использования класса org.mockito.ArgumentCaptor и того, как он отличается от простых совпадений, которые снабжены mockito.Пример аргумента MockitoCaptor

Я прочитал предоставленные документы mockito, но это не ясно иллюстрирует это, ни они не могут объяснить это с ясностью.

ответ

10

Два основных отличия:

  • при захвате даже один аргумент, вы можете сделать гораздо более сложные тесты на этот аргумент, и с более очевидным кодом;
  • a ArgumentCaptor может захватывать еще чем один раз.

Для иллюстрации последнего, скажем, у вас есть:

final ArgumentCaptor<Foo> captor = ArgumentCaptor.forClass(Foo.class); 

verify(x, times(4)).someMethod(captor.capture()); // for instance 

Тогда похититель будет в состоянии дать вам доступ ко всем 4 аргументов, которые вы можете выполнять утверждения отдельно.

Это или любое количество аргументов на самом деле, так как VerificationMode не ограничено фиксированным числом вызовов; в любом случае, захватчик предоставит вам доступ ко всем из них, если хотите.

Это также имеет то преимущество, что такие тесты (imho) намного проще писать, чем выполнять собственные ArgumentMatcher s - особенно если вы комбинируете mockito с assertj.

О, пожалуйста, рассмотрите возможность использования TestNG вместо JUnit.

+1

Что делать, если существует несколько параметров, передаваемых в метод - все из разных типов? Как вы на самом деле проверяете, что логический параметр был ** true **, например. –

+5

Можете ли вы дать объяснение для своего комментария: _Oh, и, пожалуйста, рассмотрите возможность использования TestNG вместо JUnit._. Зачем это считать? Зачем меняться? – Navigatron

38

Я согласен с тем, что сказал @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); 
1

Рассмотрим ситуацию, когда мы тестируем метод, который зависит от соавтора , Этот соавтор принимает аргумент при вызове одного из своих методов. Теперь может быть два scenarios- 1. Аргумент передаются извне методу тестируется и затем используется соавтором во время своего собственного вызова метода

method(argument arg) 
    { 
    collaborator.callMethod(arg); 
    } 

Для проверки этого метода мы издеваться Коллаборатор а затем вызвать метод следующего

method(arg1); 
    Mockito.verify(collaborator).callMethod(arg1); 

так вот в методе испытаний мы имеем arg1 экземпляра и, следовательно, может быть проверен
2.Аргумент используется соавтора, чтобы сделать свой собственный метод вызова не передается извне, и, но создается внутри метода тестируется

method() 
{ 
arg=CreateArgumentInternally(); 
collaborator.callMethod(arg); 
} 

Для проверки этого метода мы издеваться Сотрудница, а затем вызвать метод следующим

method();

Но как мы убеждаемся, что соавтор был вызван с помощью каких аргументов, поскольку у нас нет доступа к аргументу, поскольку он был создан внутри метода. Это, где Mockito ArgumentCaptor входит в картину.
Используя ArgumentCaptor, мы можем получить экземпляр аргумента, созданный внутренне и используемый в вызове соавтора, и, таким образом, мы можем его проверить.

Mockito.verify(collaborator).callMethod(captor.capture()); 
    Argument actual = captor.getValue(); 

Справочно Understanding Mockito ArgumentCaptor using Spring Boot Test Example

Смежные вопросы