0

我是 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";  
   }
}

我想测试两件事:

  1. 当我打电话时methodToTestprocess()方法被调用

  2. process()使用包含操作的正确参数调用方法"submit"

我能够验证process()最终很容易使用Mockito.verify(). "submit"然而,到目前为止,尝试检查 params 是否包含动作非常困难。

我尝试了以下方法,但它不起作用:(

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))

有什么建议吗?

4

2 回答 2

0

Parameter只需作为构造函数参数传入类的构造函数,然后在您的测试中使用模拟A实例/实现并在模拟上验证。Parameter这就是它通常的完成方式——你分离你的类并使用构造函数注入来组合它们,这使你能够传递模拟以进行测试(它还允许重新连接应用程序并更容易地交换一些公共资源)。

如果您需要Parameter在每个函数调用上创建,您应该使用创建Parameter实例并将其传入的工厂。然后您可以验证工厂以及工厂创建的对象。

于 2014-07-05T23:00:29.683 回答
0

如果您有 verify() 工作,大概只是使用参数匹配器检查参数包含的情况。

http://docs.mockito.googlecode.com/hg/org/mockito/Mockito.html#3

上述文档中给出的示例是verify(mockedList).get(anyInt()). 你也可以说verify(mockedList).get(argThat(myCustomMatcher))

顺便说一句,听起来你在嘲笑被测试的班级。我发现这通常意味着我没有清楚地考虑我的课程或考试,或两者兼而有之。在您的示例中,您应该能够测试它methodToTest()是否返回正确的结果,而不管它是否调用process(),因为它返回 a String。mockito 人有很多关于这类事情的好文档,特别是“猴子岛”博客: http: //monkeyisland.pl/

于 2014-07-05T23:04:33.283 回答