我需要在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()
的使用不明确,并且无法覆盖要测试的多个场景。
扩展课程没有帮助,也导致其他并发症。
有没有办法解决这个问题。
答案 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());
}