【发布时间】:2019-08-27 22:18:45
【问题描述】:
类结构如下:
Class A{
private B b;
public void methodA(int x, String y, String z){
if methodB(int x, String y, methodC(String z)){
// do stuff
} else {
//do stuff
}
}
public boolean methodB(int p, String q, int r){
//do stuff
return c; //boolean
}
public Integer methodC(String x){
// do stuff
return y; //Integer
}
}
我正在为 methodA 编写单元测试,我希望确保 methodB 只被调用一次。
我为此尝试使用 Mockito。
public class TestModule{
@Mock
B b;
@InjectMocks
A a;
@Before
Public void setup(){
MockitoAnnotations.initMocks(this);
}
// other tests
@Test
public void testMethodA(){
Mockito.when(a.methodB(Mockito.anyInt(), Mockito.anyString(), Mockito.anyInt())).thenReturn(Mockito.anyBoolean());
verify(a, times(1)).methodB(Mockito.anyInt(), Mockito.anyString(), Mockito.anyInt());
}
}
我收到一个错误: 参数匹配器的使用无效! 预计有 1 个匹配者,记录了 3 个: 指向代码行“Mockito.when ...”三次。
我不太确定出了什么问题。请帮我弄清楚。还有我想念的更好或更简单的方法吗?
非常感谢。
【问题讨论】:
-
您不应该在
thenReturn函数中使用ArgumentMatcher之类的anyBoolean()。这些仅用于匹配参数。而是返回一个实际值。 -
您也不能在非模拟对象上使用
Mockito.when(a)。您想在模拟b上定义行为。但是,您的代码示例没有显示b的用途。a是您正在测试的课程,不应被嘲笑。 -
谢谢@second。我嘲笑 b 因为我有其他方法可以测试,它们工作得很好。感谢您对 ArgumentMatcher 和 Mockito 的澄清。
标签: spring spring-mvc junit mockito