mockito - 如何检查方法中的实例

时间:2014-07-05 22:52:59

标签: java mockito matcher argument-matcher

我是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. 当我致电methodToTest时,调用process()方法

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

  4. 我能够验证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))
    

    有什么建议吗?

2 个答案:

答案 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/