Мокито 1 и 2 не имеют одинакового уровня "строгости".
Кроме того, при использовании Mockito 2 с JUnit 4 или 5 уровень по умолчанию все равно будет другим.
Подводя итог:
3 уровня строгости:
LENIENT
: минимальная строгость
WARN
: дополнительные предупреждения выводятся на консоль
STRICT_STUBS
: обеспечивает чистые тесты, выдавая исключение в случае возможного неправильного использования, но также может давать некоторые ложные срабатывания.
Эффективный уровень по умолчанию в соответствии с используемыми API:
- Mockito 1:
LENIENT
- Mockito 2 с JUnit 4:
WARN
- Mockito 2 с JUnit 5 (
MockitoExtension.class
): STRICT_STUBS
- Mockito 3: запланировано на
STRICT_STUBS
.
Подробнее
В документации Mockito об этом очень ясно сказано:
Strictness
Javadoc состояния:
Настраивает "строгость" Мокито во время сеанса насмешки.
сеанс обычно отображается на один вызов метода тестирования. взыскательность
проводит более чистые тесты и повышает производительность. Самый простой способ
усилить строгость использует поддержку MUKITO JUnit
(MockitoRule или MockitoJUnitRunner). Если вы не можете использовать поддержку JUnit
MockitoSession - это путь.
Как уровень строгости влияет на поведение теста (насмешливый
сессия)
1. Strictness.LENIENT
- без дополнительного поведения. По умолчанию Mockito 1.x.Рекомендуется, только если вы не можете использовать STRICT_STUBS или WARN.
2. Strictness.WARN
- помогает поддерживать чистоту тестов и улучшает возможность отладки. Сообщает о предупреждениях консоли о неиспользуемых заглушках и заглушках
несоответствие аргумента (см. org.mockito.quality.MockitoHint). По умолчанию
Поведение Mockito 2.x при использовании JUnitRule или MockitoJUnitRunner.
Рекомендуется, если вы не можете использовать STRICT_STUBS.
3. Strictness.STRICT_STUBS
- обеспечивает чистоту тестов, уменьшает дублирование тестов, улучшает возможность отладки. Лучшее сочетание гибкости
и производительность. Настоятельно рекомендуется. Планируется по умолчанию для Mockito
v3.Для получения подробной информации см. STRICT_STUBS.
Но независимо от того, что сгенерировано исключение, связанное с сообщением
"имеет следующие заглушки с разными аргументами"
кажется слишком строгой проверкой.
Сообщение об исключении в некотором роде подтверждает это:
Однако существуют законные сценарии, когда это исключение создает ложное
отрицательный сигнал:
...
- метод-заглушка намеренно вызывается с различными аргументами тестируемым кодом
Так что запретить его по умолчанию кажется слишком много.
Так что, если вы используете JUnit 5, в качестве альтернативы STRICT_STUBS
вы можете использовать WARNING
, но вы обычно хотите избегать LENIENT
, который слишком тихий.
В дополнение к MockitoExtension
библиотека mockito-junit-jupiter
предоставляет
@MockitoSettings
, который можно использовать как на уровне метода, так и на уровне класса.
Вот пример:
import java.util.List;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Mockito;
import org.mockito.junit.jupiter.MockitoExtension;
import org.mockito.junit.jupiter.MockitoSettings;
import org.mockito.quality.Strictness;
@ExtendWith(MockitoExtension.class)
public class FooTest {
@MockitoSettings(strictness = Strictness.WARN)
@Test
void foo() throws Exception {
List<String> strings = Mockito.mock(List.class);
Mockito.when(strings.add("a"))
.thenReturn(true);
Mockito.when(strings.add("b"))
.thenReturn(false);
}
@Test
void fooKo() throws Exception {
List<String> strings = Mockito.mock(List.class);
Mockito.when(strings.add("a"))
.thenReturn(true);
Mockito.when(strings.add("b"))
.thenReturn(false);
}
}
fooKo()
выдает исключение неправильного использования Mockito, в то время как foo()
успешно, но выдает полезные предупреждения:
[MockitoHint] FooTest (see javadoc for MockitoHint):
[MockitoHint] 1. Unused -> at FooTest.foo(FooTest.java:19)
[MockitoHint] 2. Unused -> at FooTest.foo(FooTest.java:21)
В качестве другой альтернативы вы также можете использовать Mockito.lenient()
, очень хорошо описанный
aschoerk, чтобы применить снисходительную строгость для конкретного вызова.
Кроме того, вы можете установить все ложные вызовы как снисходительные при создании экземпляра:
@Test
void foo() throws Exception {
List<String> strings = Mockito.mock(List.class, Mockito.withSettings()
.lenient());
....
}