与第三方课程一起使用Mockito



我需要将Mockito.when中的第三方类用作参数。该类没有平等的实现,因此Mockito.when总是返回null,除了使用any()的情况。

以下总是返回null:

when(obj.process(new ThirdParytClass())).thenReturn(someObj);

但是,这有效

when(obj.process(any(ThirdParytClass.class))).thenReturn(someObj);

但是,问题是process()方法在实际代码中被调用两次,并且使用any()是模棱两可的,并且无助于覆盖多种情况进行测试。

延长课程无济于事,也会导致其他并发症。

是否有一种解决问题的方法。

如果类未实现(明智的(equals(Object),则可以通过实现自己的ArgumentMatcher来匹配自己的实例。Java 8的功能界面使其很容易编写(并不是说它在早期版本中是如此巨大,但仍然很艰辛(:

when(obj.process(argThat(tpc -> someLogic()))).thenReturn(someObj);

但是,如果您只想比较类的数据成员,那么内置的refEq匹配器就会做到这一点:

ThirdParytClass expected = new ThirdParytClass();
// set the expected properties of expected
when(obj.process(refEq(expected))).thenReturn(someObj);

Mockito提供了绑架功能,该功能可能有助于您绕过equals()方法的限制,因为覆盖equals()进行测试通行证可能是可取的,但并非总是如此。


此外,有时equals()可能不会太过填充。这是您的用例。

这是带有ArgumentCaptor的示例代码:

@Mock
MyMockedClass myMock;
@Captor
ArgumentCaptor argCaptor;
@Test
public void yourTest() {
    ThirdPartyClass myArgToPass = new ThirdPartyClass();
    // call the object under test
     ...
    //
    Mockito.verify(myMock).process(argCaptor.capture());
    // assert the value of the captor argument is the expected onoe
    assertEquals(myArgToPass , argCaptor.getValue());
}

相关内容

  • 没有找到相关文章

最新更新