Mockito: исключение в фиктивном входном потоке #чтение (байт [])

#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 иначе. Я бы использовал макет только для действительно детального управления, такого как «что произойдет, если мой входной поток закодированного текста вернет первую половину символа в одном вызове, а затем оставшуюся часть в следующем …»