我想让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
问题:为什么? !为什么会出现这个异常?
您试图从调用中返回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;
}
});
然而,我可能不会为此使用mock——如果绝对必要,我会使用fake,否则使用ByteArrayInputStream
。我只对真正的细粒度控制使用模拟,例如"如果我的编码文本输入流在一次调用中返回字符的前半部分,然后在下一次调用中返回其余部分,会发生什么?"