Search code examples
javamockitomatcherargument-matcher

mockito - how to check an instance inside a method


I am new to Mockito, I am trying to verify the attributes of an object which gets created inside a method.

pseudo code below:

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

I want to test 2 things:

  1. when I called methodToTest, process() method is called

  2. process() method is called with the correct params containing action "submit"

I was able to verify that process() is eventually called easily using Mockito.verify(). However trying to check that params contains action "submit" is very difficult so far.

I have tried the following but it doesn't work :(

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

Any suggestion ?


Solution

  • If you have got verify() to work, presumably it is just a case of using an argument matcher to check the contains of params.

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

    The example given in the above docs is verify(mockedList).get(anyInt()). You can also say verify(mockedList).get(argThat(myCustomMatcher)).

    As an aside, it sounds like you are mocking the class under test. I've found that this usually means I haven't thought clearly about either my class or my test or both. In your example, you should be able to test that methodToTest() returns the right result irrespective of whether or not it calls process() because it returns a String. The mockito folk have lots of good documentation about this sort thing, particularly the "monkey island" blog: http://monkeyisland.pl/.