Проверьте, не вызван ли метод с помощью Mockito - PullRequest
0 голосов
/ 24 августа 2018

У меня есть метод void, который создает объекты типа Foo и обновляет каждую запись списка этих объектов.

Когда список, переданный параметром, пуст, он не должен создавать никаких объектов, поэтому не можетВызов любого метода сеттера класса Foo.

public static void analyzeList(ArrayList<Something> list) {
    for (Something s : list) {
        Foo f = new Foo();

        f.setSomething(someMethod1(f));
        f.setSomething2(someMethod2(f));

        s.setFoo(f);
    }
}

Итак, я пытаюсь использовать Mockito, чтобы проверить, что метод analyzeList(ArrayList<Something> list) не вызывает метод сеттера класса Foo, но у меняэто было непросто, поскольку я никогда раньше не работал с Mockito.

Я написал этот тест:

@Test
public void shouldNotCallSettersWhenListIsEmpty() {
    Foo fooMocked = mock(Foo.class);
    FooLogic.analyzeList(emptyList);
    Mockito.verify(fooMocked, times(0)).setSomething(anyInt());
}

Этот тест пройден, и он должен.Но когда я изменяю times(0) на times(1), тест продолжает проходить и не должен, так как список пуст.

Что я здесь не так делаю?

Ответы [ 2 ]

0 голосов
/ 24 августа 2018

В вашей ситуации, Мне нравится использовать InOrder функциональные возможности; конкретно InOrder.verifyNoMoreInteractions() способ.

Вот пример:

import static org.mockito.Mockito.inOrder;

    import org.mockito.InOrder;

@Test
public void shouldNotCallSettersWhenListIsEmpty() {
    Foo fooMocked = mock(Foo.class);

    InOrder inOrderVariable = inOrder(fooMocked);

    FooLogic.analyzeList(emptyList);
    //Mockito.verify(fooMocked, times(0)).setSomething(anyInt());

    // Note: added example verify statement.
    inOrderVariable.verify(fooMocked).someMethod(paramaters)

    inOrderVariable.verifyNoMoreInteractions();
}
0 голосов
/ 24 августа 2018

Объект Foo, который вы имеете в своем тесте, и объекты Foo, которые вы создаете в своем analyzeList, отличаются. Вы создаете новый объект Foo каждый раз в своем коде.

Даже если вы передадите непустой список, Mockito.verify(fooMocked, times(0)).setSomething(anyInt()); пройдет, потому что вы не вызываете никакие методы в поддельном экземпляре Foo.

Но вы говорите, что при изменении times(0) на times(1) тест все равно проходит. Но тест должен провалиться (вы можете проверить это)

При текущей настройке вы не можете ничего проверить на созданных Foo f экземплярах 1 . Вы все еще можете проверить setFoo звонки, которые вы делаете на Something, если список, который вы передаете, содержит фиктивные Something объекты.


1 , если вы не используете Powermockito или что-то, что позволяет вам высмеивать new создания объектов в коде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...