Thursday 26 May 2016

java - How to mock void methods with Mockito



How to mock methods with void return type?



I implemented an observer pattern but I can't mock it with Mockito because I don't know how.



And I tried to find an example on the Internet but didn't succeed.




My class looks like this:



public class World {

List listeners;

void addListener(Listener item) {
listeners.add(item);
}


void doAction(Action goal,Object obj) {
setState("i received");
goal.doAction(obj);
setState("i finished");
}

private string state;
//setter getter state
}


public class WorldTest implements Listener {

@Test public void word{
World w= mock(World.class);
w.addListener(this);
...
...

}

}

interface Listener {
void doAction();
}


The system is not triggered with mock.



I want to show the above-mentioned system state. And make assertions according to them.



Answer



Take a look at the Mockito API docs. As the linked document mentions (Point # 12) you can use any of the doThrow(),doAnswer(),doNothing(),doReturn() family of methods from Mockito framework to mock void methods.



For example,



Mockito.doThrow(new Exception()).when(instance).methodName();


or if you want to combine it with follow-up behavior,




Mockito.doThrow(new Exception()).doNothing().when(instance).methodName();


Presuming that you are looking at mocking the setter setState(String s) in the class World below is the code uses doAnswer method to mock the setState.



World  mockWorld = mock(World.class); 
doAnswer(new Answer() {
public Void answer(InvocationOnMock invocation) {
Object[] args = invocation.getArguments();
System.out.println("called with arguments: " + Arrays.toString(args));

return null;
}
}).when(mockWorld).setState(anyString());

No comments:

Post a Comment

c++ - Does curly brackets matter for empty constructor?

Those brackets declare an empty, inline constructor. In that case, with them, the constructor does exist, it merely does nothing more than t...