EasyMock: Void Methods

easymock, java, mocking, unit-testing, void

Solution

If I understand what you want to do correctly, you should be able to use `andAnswer()`:

mockObject.someMethod(eq(param1), eq(param2));
expectLastCall().andAnswer(new IAnswer() {
    public Object answer() {
        //supply your mock implementation here...
        SomeClass arg1 = (SomeClass) getCurrentArguments()[0];
        AnotherClass arg2 = (AnotherClass) getCurrentArguments()[1];
        arg1.doSomething(blah);
        //return the value to be returned by the method (null for void)
        return null;
    }
});

The EasyMock User Guide explains:

Creating Return Values or Exceptions

Sometimes we would like our mock object to return a value or throw an exception that is created at the time of the actual call. Since EasyMock 2.2, the object returned by `expectLastCall()` and `expect(T value)` provides the method `andAnswer(IAnswer answer)` which allows [you] to specify an implementation of the interface `IAnswer` that is used to create the return value or exception.

Inside an `IAnswer` callback, the arguments passed to the mock call are available via `EasyMock.getCurrentArguments()`. If you use these, refactorings like reordering parameters may break your tests. You have been warned.

Problem

I have a method that returns void in a class that is a dependency of the class I want to test. This class is huge and I'm only using this single method from it. I need to replace the implementation of this method for the test as I want it to do something different and I need to be able to access the parameters this method receives. I cannot find a way of doing this in EasyMock. I think I know how to do it with Mockito by using `doAnswer` but I don't want to add another library unless absolutely necessary.

Original source