我有类似方法的签名
public void add(byte[] key, Optional<Byte[]> secondaryKey) { ... }
我的测试看起来像
byte[] key = "testKey".getBytes();
byte[] secondaryKey = "secondaryKey".getBytes()
//call the method that internally calls add()
Mockito.verify(mockClass).add(key, Optional.of(ArrayUtils.toObject(secondaryKey))
在这种情况下,验证总是失败,表示所需参数与实际参数不同。我有一个类似的add
方法,只是将byte[] key
作为输入参数。该方法的测试成功。因此,我认为此处尝试匹配Optional
参数的方式存在问题。
答案 0 :(得分:2)
Optional
不执行deepEquals
,因此考虑到您已将Byte[]
传递到Optional
中,相等检查将失败。
您可以从遇到类似问题的用户那里看到此错误报告。 JDK-8075723
您可能需要利用一些ArgumentMatchers
来比较传递给模拟的参数。
由于传递了Optional
,因此可以使用ArgumentMatchers.argThat
来取消包装该对象,这需要您实现ArgumentMatcher.matches
方法。
Mockito.verify(mockClass).add(ArgumentMatchers.eq(key), ArgumentMatchers.argThat(r -> {
return r.isPresent() && Objects.deepEquals(secondaryKey, r.get())
));
编辑:
如果您希望捕获传递到模拟中的参数的状态并执行断言,则也可以使用ArgumentCaptor
。
ArgumentCaptor<Optional> captor =ArgumentCaptor.forClass(Optional.class)
verify(pojo).add(eq(key), captor.capture());
Optional<byte[]> result = captor.getValue();
assertTrue(result.isPresent());
assertArrayEquals(secondaryKey, result.get());