我是Mockito的新手,我正在尝试验证在方法中创建的对象的属性。
下面的伪代码:
class A{
...
public String methodToTest(){
Parameter params = new Parameter(); //param is basically like a hashmap
params.add("action", "submit");
return process(params);
}
...
public String process(Parameter params){
//do some work based on params
return "done";
}
}
我想测试两件事:
当我致电methodToTest
时,调用process()
方法
process()
方法"submit"
我能够验证process()
最终是否可以使用Mockito.verify()
轻松调用。
然而,到目前为止,试图检查params包含动作"submit"
是非常困难的。
我尝试过以下但不起作用:(
BaseMatcher<Parameter> paramIsCorrect = new BaseMatcher<Parameter>(){
@Overrides
public boolean matches(Object param){
return ("submit".equals((Parameter)param.get("action")));
}
//@Overrides description but do nothing
}
A mockA = mock(A);
A realA = new A();
realA.methodToTest();
verify(mockA).process(argThat(paramIsCorrect))
有什么建议吗?
答案 0 :(得分:0)
只需将Parameter
作为构造函数参数传递给类A
的构造函数,然后在测试中使用模拟的Parameter
实例/实现并验证模拟。这就是通常的方式 - 你将你的类分开并使用构造函数注入来组合它们,这使你能够传入模拟进行测试(它还允许重新连接应用程序并更轻松地交换一些公共文件) )。
如果您需要在每个函数调用上创建Parameter
,您应该使用创建Parameter
实例的工厂并将其传入。然后您可以验证工厂以及由此创建的对象。工厂。
答案 1 :(得分:0)
如果你有verify()工作,可能只是使用参数匹配器来检查params的包含。
http://docs.mockito.googlecode.com/hg/org/mockito/Mockito.html#3
上述文档中给出的示例是verify(mockedList).get(anyInt())
。您也可以说verify(mockedList).get(argThat(myCustomMatcher))
。
顺便说一句,这听起来像是在嘲笑被测试的班级。我发现这通常意味着我无法清楚地了解我的班级或考试,或两者兼而有之。在您的示例中,您应该能够测试methodToTest()
是否返回正确的结果,而不管它是否调用process()
,因为它返回String
。 mockito人有很多关于这种东西的好文档,特别是猴子岛#34;博客:http://monkeyisland.pl/。