我尝试使用 Mockito 模拟一个类的行为。这使用 Mockito 1.x 有效。迁移到 JUnit 5 和 Mockito 2 它似乎不再工作了。
@ExtendWith(MockitoExtension.class)
public class MockitoExample {
static abstract class TestClass {
public abstract int booleanMethod(boolean arg);
}
@Mock
TestClass testClass;
@BeforeEach
public void beforeEach() {
when(testClass.booleanMethod(eq(true))).thenReturn(1);
when(testClass.booleanMethod(eq(false))).thenReturn(2);
}
@Test
public void test() {
assertEquals(1,testClass.booleanMethod(true));
assertEquals(2,testClass.booleanMethod(false));
}
}
期望是,模拟的 TestClass 显示测试方法中测试的行为。
我得到的错误是:
org.mockito.exceptions.misusing.PotentialStubbingProblem:
Strict stubbing argument mismatch. Please check:
- this invocation of 'booleanMethod' method:
testClass.booleanMethod(false);
-> at org.oneandone.ejbcdiunit.mockito_example.MockitoExample.beforeEach(MockitoExample.java:30)
- has following stubbing(s) with different arguments:
1. testClass.booleanMethod(false);
-> at org.oneandone.ejbcdiunit.mockito_example.MockitoExample.beforeEach(MockitoExample.java:29)
Typically, stubbing argument mismatch indicates user mistake when writing tests.
Mockito fails early so that you can debug potential problem easily.
However, there are legit scenarios when this exception generates false negative signal:
- stubbing the same method multiple times using 'given().will()' or 'when().then()' API
Please use 'will().given()' or 'doReturn().when()' API for stubbing.
- stubbed method is intentionally invoked with different arguments by code under test
Please use default or 'silent' JUnit Rule (equivalent of Strictness.LENIENT).
For more information see javadoc for PotentialStubbingProblem class.
在这两种情况下,参数 false
似乎是匹配的,尽管我显然匹配 true
。
这是 Mockito 2.17 中的错误还是误解。我应该/如何使用 Mockito 2.x 来模拟具有不同布尔参数的调用?
该 示例 也可以在 github 上找到。但是 surefire 将只使用开始测试
mvn test -Dtest=MockitoExample
使用 Mockito 2.21 执行测试会导致相同的结果。
原文由 aschoerk 发布,翻译遵循 CC BY-SA 4.0 许可协议
从 Mockito 2.20 开始,也可以在本地添加 lenient()