Модульное тестирование, когда возвращаемое значение является ложным ожиданием - PullRequest
0 голосов
/ 05 октября 2018

Итак, у меня есть метод, который выглядит примерно так:

public Foo method() { ... return service.get(); }

service - это внешняя зависимость класса.

Мой тестовый код:

Foo mockServiceResponse = Mockito.mock(Foo.class); when(service.get()).thenReturn(mockServiceResponse);

В моем модульном тесте я внедряю макет, созданный с помощью Mockito, и задаю when для service.get(), поэтому мой вопрос в том, как проверить возвращаемое значение method?Если я просто проверю, равняется ли mockServiceResponse method(), то тест не проверяет много, поскольку, если кто-то изменит method на:

public Foo method() { ... Foo f = service.get(); f.setId(null); return f; }

Мой тест все равно пройдет, чтоочевидно, что неправильно, так как я должен это проверить?

ПОЯСНЕНИЕ: Я хочу проверить, что method не меняет объект, возвращенный с service.get() (то есть, я хочувторая заглушка, которая провалила мой тест), проблема в том, что фиктивные объекты просто игнорируют вызываемые им методы (например, setId()), не проваливая тест.

Ответы [ 2 ]

0 голосов
/ 07 октября 2018

Вы можете использовать verifyNoMoreInteractions или verifyZeroInteractions от Mockito, чтобы утверждать, что к объекту ответа службы не было сделано никаких вызовов.

@Test
public void should_not_mutate_response() {
    // given
    Service mockService = Mockito.mock(Service.class);
    Foo mockServiceResponse = Mockito.mock(Foo.class);
    when(mockService.get()).thenReturn(mockServiceResponse);

    SubjectUnderTest subjectUnderTest = new SubjectUnderTest(mockService);

    // when
    Foo result = subjectUnderTest.method();

    //then
    Mockito.verifyZeroInteractions(mockServiceResponse);
}

Или еслив конце концов вы ожидаете каких-то определенных взаимодействий с объектом ответа:

@Test
public void should_set_id_on_response() {
    // given
    ...

    // when
    ...

    // then
    Mockito.verify(mockServiceResponse).setId(ArgumentMatchers.anyInt());
    Mockito.verifyNoMoreInteractions(mockServiceResponse);
}
0 голосов
/ 05 октября 2018

Вы будете делать что-то вроде:

Service service = mock(Service.class);
Foo aResponse = new Foo(1);
when(service.get()).thenReturn(aResponse);

MyClass subject = new MyClass(service);

Foo result = subject.method();
assertNull(result.getId());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...