Mockito проверяет совпадение Необязательно для массива - PullRequest
0 голосов
/ 02 октября 2018

У меня есть подпись метода, такая как

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 голосов
/ 02 октября 2018

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