Сохранить информацию, которая была подсмотрена Mockito - PullRequest
0 голосов
/ 19 декабря 2018

У меня есть тест JUnit:

@Spy
ParallelSender parallelSender = new ParallelSender();


@Test
public void send() {   
    // making some data...
    parallelSender.send(someData);
    // check that internal method has been called with Sender Task made from someData
    verify(parallelSender).doSend(any(SenderTask.class));
}

Однако я хотел бы проверить, что SenderTask содержит все поля именно так, как они мне нужны.Могу ли я сказать шпиону перехватить вызов doSend , сохранить его параметры в некотором массиве и затем перейти к реальному методу?

Ответы [ 3 ]

0 голосов
/ 19 декабря 2018

Используйте ArgumentCaptor:

@Test
public void send() {   
    // making some data...
    parallelSender.send(someData);

   // Define the captor for class
    ArgumentCaptor<SenderTask> captor =
        ArgumentCaptor.forClass(SenderTask.class);

    // Capture input while verifying
    verify(parallelSender).doSend(captor.capture());

    // Assert 
    SomeTask result = captor.getValue();
    // assertions on result
}
0 голосов
/ 19 декабря 2018

Я редко использую аргумент captor, потому что обычно это не нужно.Просто сделайте это

@Test
public void send() {   
    //given
    SomeData myInput = ...
    SenderTask expectedOutput = new SenderTask();
    expectedOutput.setSomeField(/*expected field value*/);

    //when
    parallelSender.send(myInput);

    //then
    verify(parallelSender).doSend(expectedOutput);
 }

Идея состоит в том, чтобы проверить, что doSend был вызван с ожидаемым объектом.

Примечание: просто убедитесь, что вы реализовали метод equals / hash в SenderTask -или это не будет работать

Примечание 2: Я бы рекомендовал избегать использования any () в ваших модульных тестах.Обычно, когда вы что-то тестируете, вы хотите быть максимально точным.Поэтому используйте конкретные объекты при проверке результатов.

Надеюсь, это поможет

0 голосов
/ 19 декабря 2018

Вы можете использовать ArgumentCaptor.

@Captor
ArgumentCaptor<SenderTask> captor;
// or ArgumentCaptor<SenderTask> captor = 
//         ArgumentCaptor.forClass(SenderTask.class);

@Test public void send() {
    // ...
    verify(parallelSender).doSend(captor.capture());
    SenderTask captured = captor.getValue();
...