Mockito 验证仍然无法使用所有匹配器
Mockito verify still fails on using all Matchers
我最近正在写一个 JUnit 测试,我承认 Mockito 要么需要所有原始值,要么使用所有匹配器,但我发现以下情况对于所有匹配器仍然失败,错误消息是:
Invalid use of argument matchers!
0 matchers expected, 1 recorded:
我进行了一些测试,它看起来与使用存根方法作为 eq() 匹配器的值有关。请参阅下面的示例:
我有一个Class一个很简单
public class A {
public void testMockitoMatcher(double a, String b){
}
}
这是我的测试用例
import org.junit.Test;
import static org.mockito.Mockito.*;
public class SomeUnitTest {
private A mockA = mock(A.class);
@Test
public void allMatchersDoesntWork() {
Object mockObject = mock(Object.class);
String someString = "Just some mocked String value to return";
when(mockObject.toString()).thenReturn(someString);
mockA.testMockitoMatcher(1312d, mockObject.toString());
verify(mockA, times(1)).testMockitoMatcher(anyDouble(), eq(someString)); //<- This works
verify(mockA, times(1)).testMockitoMatcher(anyDouble(), eq(mockObject.toString())); //<- This doesn't by using stub method toString() to return the String value as param to eq()
}
}
我还在第二个验证语句中使用调试验证 mockObject.toString() 仍然可以 return 我的存根值。两者都验证使用所有匹配器,为什么 mockito 在第二次验证时仍然只给我记录了 1 个匹配器而不是 2 个匹配器?
谢谢!
Mockito 希望您的测试分三个阶段进行。
- 您为测试设置了东西,包括打桩任何需要打桩的方法(“安排”阶段)。
- 您 运行 您尝试测试的实际方法(“行动”阶段)。
- 您对测试的输出做出断言,可能包括验证在您的模拟中调用了哪些方法(“断言”阶段)。
您需要按此顺序执行这三件事,因为 Mockito 会跟踪您是在进行存根、验证还是其他操作。它还有自己的内部堆栈,用于存储匹配器,用于存根或验证。
在您的示例中的第二个 verify
调用中,对 anyDouble()
的调用将 Matcher
放入堆栈。但这会为 mockObject.toString()
.
的调用创建一个无效状态
不要这样做。一旦您准备好 运行 您的断言和验证,您不应该再调用存根方法。将每个测试的“安排”、“执行”和“断言”阶段彼此完全分开。
我最近正在写一个 JUnit 测试,我承认 Mockito 要么需要所有原始值,要么使用所有匹配器,但我发现以下情况对于所有匹配器仍然失败,错误消息是:
Invalid use of argument matchers! 0 matchers expected, 1 recorded:
我进行了一些测试,它看起来与使用存根方法作为 eq() 匹配器的值有关。请参阅下面的示例:
我有一个Class一个很简单
public class A {
public void testMockitoMatcher(double a, String b){
}
}
这是我的测试用例
import org.junit.Test;
import static org.mockito.Mockito.*;
public class SomeUnitTest {
private A mockA = mock(A.class);
@Test
public void allMatchersDoesntWork() {
Object mockObject = mock(Object.class);
String someString = "Just some mocked String value to return";
when(mockObject.toString()).thenReturn(someString);
mockA.testMockitoMatcher(1312d, mockObject.toString());
verify(mockA, times(1)).testMockitoMatcher(anyDouble(), eq(someString)); //<- This works
verify(mockA, times(1)).testMockitoMatcher(anyDouble(), eq(mockObject.toString())); //<- This doesn't by using stub method toString() to return the String value as param to eq()
}
}
我还在第二个验证语句中使用调试验证 mockObject.toString() 仍然可以 return 我的存根值。两者都验证使用所有匹配器,为什么 mockito 在第二次验证时仍然只给我记录了 1 个匹配器而不是 2 个匹配器?
谢谢!
Mockito 希望您的测试分三个阶段进行。
- 您为测试设置了东西,包括打桩任何需要打桩的方法(“安排”阶段)。
- 您 运行 您尝试测试的实际方法(“行动”阶段)。
- 您对测试的输出做出断言,可能包括验证在您的模拟中调用了哪些方法(“断言”阶段)。
您需要按此顺序执行这三件事,因为 Mockito 会跟踪您是在进行存根、验证还是其他操作。它还有自己的内部堆栈,用于存储匹配器,用于存根或验证。
在您的示例中的第二个 verify
调用中,对 anyDouble()
的调用将 Matcher
放入堆栈。但这会为 mockObject.toString()
.
不要这样做。一旦您准备好 运行 您的断言和验证,您不应该再调用存根方法。将每个测试的“安排”、“执行”和“断言”阶段彼此完全分开。