How to mock void methods with Mockito

前端 未结 9 2111
情话喂你
情话喂你 2020-11-22 12:21

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 fin

相关标签:
9条回答
  • 2020-11-22 13:10

    Adding another answer to the bunch (no pun intended)...

    You do need to call the doAnswer method if you can't\don't want to use spy's. However, you don't necessarily need to roll your own Answer. There are several default implementations. Notably, CallsRealMethods.

    In practice, it looks something like this:

    doAnswer(new CallsRealMethods()).when(mock)
            .voidMethod(any(SomeParamClass.class));
    

    Or:

    doAnswer(Answers.CALLS_REAL_METHODS.get()).when(mock)
            .voidMethod(any(SomeParamClass.class));
    
    0 讨论(0)
  • 2020-11-22 13:18

    Adding to what @sateesh said, when you just want to mock a void method in order to prevent the test from calling it, you could use a Spy this way:

    World world = new World();
    World spy = Mockito.spy(world);
    Mockito.doNothing().when(spy).methodToMock();
    

    When you want to run your test, make sure you call the method in test on the spy object and not on the world object. For example:

    assertEquals(0, spy.methodToTestThatShouldReturnZero());
    
    0 讨论(0)
  • 2020-11-22 13:22

    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<Void>() {
        public Void answer(InvocationOnMock invocation) {
          Object[] args = invocation.getArguments();
          System.out.println("called with arguments: " + Arrays.toString(args));
          return null;
        }
    }).when(mockWorld).setState(anyString());
    
    0 讨论(0)
提交回复
热议问题