Можно ли делать строгие издевательства с Mockito? - PullRequest
15 голосов
/ 04 ноября 2011

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

Из того, что я увидел, Mockito, если я не определил никаких ожиданий, просто вернет null, что позже вызовет исключение NullPointerException в другом месте.

Возможно ли это сделать?Если да, то как?

Ответы [ 4 ]

15 голосов
/ 04 ноября 2011

Что вы хотите, чтобы он делал?

Вы можете установить его на RETURN_SMART_NULLS , что позволяет избежать NPE и включает некоторую полезную информацию.

Вы можете заменить это пользовательской реализацией, например, которая выдает исключение из метода answer:

@Test
public void test() {
    Object mock = Mockito.mock(Object.class, new NullPointerExceptionAnswer());
    String s = mock.toString(); // Breaks here, as intended.
    assertEquals("", s);
}

class NullPointerExceptionAnswer<T> implements Answer<T> {
    @Override
    public T answer(InvocationOnMock invocation) throws Throwable {
        throw new NullPointerException();
    }
}
8 голосов
/ 14 июня 2013

Вы можете использовать verifyNoMoreInteractions. Это полезно, если тестируемый класс ловит исключения.

@Test
public void testVerifyNoMoreInteractions() throws Exception {
    final MyInterface mock = Mockito.mock(MyInterface.class);

    new MyObject().doSomething(mock);

    verifyNoMoreInteractions(mock); // throws exception
}

private static class MyObject {
    public void doSomething(final MyInterface myInterface) {
        try {
            myInterface.doSomethingElse();
        } catch (Exception e) {
            // ignored
        }
    }
}

private static interface MyInterface {
    void doSomethingElse();
}

Результат:

org.mockito.exceptions.verification.NoInteractionsWanted: 
No interactions wanted here:
-> at hu.palacsint.CatchTest.testVerifyNoMoreInteractions(CatchTest.java:18)
But found this interaction:
-> at hu.palacsint.CatchTest$MyObject.doSomething(CatchTest.java:24)
Actually, above is the only interaction with this mock.
    at hu.palacsint.stackoverflow.y2013.q8003278.CatchTest.testVerifyNoMoreInteractions(CatchTest.java:18)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
    ...
5 голосов
/ 27 июня 2017

Добавьте это @Rule в ваш тестовый класс как открытое поле:

@RunWith(JUnitParamsRunner.class)
public class MyClassTests {

    @Rule
    public MockitoRule mockito = MockitoJUnit.rule().strictness(Strictness.STRICT_STUBS);

    @Test
    ....
}

Это значение было добавлено в Mockito в версии 2.3.0

Из документации:

Обеспечивает чистые тесты, уменьшает дублирование тестового кода, улучшает debuggability. Предлагает лучшее сочетание гибкости и производительность. Настоятельно рекомендуется. Планируется по умолчанию для Mockito v3. Добавляет следующее поведение:

  • Повышение производительности: тест завершается неудачно, когда тестируется код вызывает метод-заглушку с разными аргументами (см. PotentialStubbingProblem).
  • Очиститель тестов без лишних заглушки: тест не пройден при наличии неиспользованных заглушек (см. UnnecessaryStubbingException).
  • Более чистые, более СУХИЕ тесты («Не повторяй» Себя "): если вы используете Mockito.verifyNoMoreInteractions (Object ...), вы больше не нужно явно проверять заглушки. Они есть автоматически подтверждено для вас.
0 голосов
/ 30 мая 2012

В соответствии с исходным кодом org.mockito.Mockito.RETURNS_DEFAULTS он выбирает «что делать, если нет ожидания» из глобальной настройки.Кроме того, «если глобальная конфигурация отсутствует, он использует {@link ReturnsEmptyValues} (возвращает нули, пустые коллекции, нули и т. Д.)». Я еще не смог выполнить эту конфигурацию.

...