mockito与第三方课程

时间:2017-06-02 21:42:56

标签: java junit mockito matcher

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

以下内容始终返回null:

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

然而,这是有效的

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

但是,问题是process()方法在实际代码中被调用了两次,并且any()的使用不明确,并且无法覆盖要测试的多个场景。

扩展课程没有帮助,也导致其他并发症。

有没有办法解决这个问题。

2 个答案:

答案 0 :(得分:2)

如果某个类没有实现(明智的)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);

答案 1 :(得分:1)

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());
}