Mockito验证匹配数组的可选

时间:2018-10-02 04:19:20

标签: java unit-testing mocking mockito

我有类似方法的签名

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参数的方式存在问题。

1 个答案:

答案 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());