Class结构如下:
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 ...”三遍。
我不太确定怎么回事。请帮我弄清楚。还有,我想念的是更好或更简单的方法吗?
非常感谢。
答案 0 :(得分:1)
我认为您通常误解了模仿工具的使用。
我假设您想测试真正的A类(尤其是methodA的行为),但是...
您从不称呼它(测试术语为锻炼)。
相反,您错误地使用了用于 stubbing 方法的@import "bootstrap-sass/bootstrap";
@import 'bootstrap/dist/css/bootstrap.min.css';
.wrapper-card-1{
@extend .card;
@extend .card-body;
@extend .card-complete-transparent;
.card-heading{
@extend .card-title;
@extend .bold;
}
.card-para{
@extend .card-text;
@extend .para;
}
.card-button{
@extend .btn;
@extend .btn-primary;
@extend .no-border;
@extend .bold;
@extend .color-blue;
}
.card-image{
@extend .card-img-top;
}
}
方法。
我不了解Mockito.when
属性的含义。您将其模拟版本注入到A中,但是...您从未使用过它。
让我强调,对内部方法的调用通常不应进行测试(仅对对外部方法的调用进行验证)。
通常您检查(b
)被模仿对象的行为
如果要检查真实对象,必须监视。
因此,检查实际SUT对象的内部调用的(不太有趣)问题的可能解决方案是:
Mockito.verify()