#java #mockito
#java #mockito
Вопрос:
Я хочу, чтобы InputStream возвращал нужные мне значения. Так что я делаю:
doAnswer(new Answer<Byte[]>() {
@Override
public Byte[] answer(InvocationOnMock invocationOnMock) throws Throwable {
return getNextPortionOfData();
}
}).when(inputMock).read(any(byte[].class));
private Byte[] getNextPortionOfData() { ...
Исключение: java.lang.Byte; cannot be cast to java.lang.Number
Вопрос: Почему ?! Почему я получаю это исключение?
Ответ №1:
Вы пытаетесь вернуть a Byte[]
из вызова, но InputStream.read(byte[])
возвращает количество прочитанных байтов и сохраняет данные в массиве байтов, на который ссылается параметр.
Итак, вам понадобится что-то вроде:
doAnswer(new Answer<Integer>() {
@Override
public Integer answer(InvocationOnMock invocationOnMock) throws Throwable {
Byte[] bytes = getNextPortionOfData();
// TODO: Copy the bytes into the argument byte array... and
// check there's enough space!
return bytes.length;
}
});
Тем не менее, я, вероятно, не стал бы использовать макет для этого в любом случае — я бы использовал подделку, если это абсолютно необходимо, или ByteArrayInputStream
иначе. Я бы использовал макет только для действительно детального управления, такого как «что произойдет, если мой входной поток закодированного текста вернет первую половину символа в одном вызове, а затем оставшуюся часть в следующем …»