java如何使用Mockito验证带有ByteBuffer参数的调用?
我正在尝试为使用ByteBuffer
的库创建一个测试
简化版如下:
public class ByteBufferTest {
public static class Stuff {
public void doSomething(Target target, ByteBuffer buffer) {
ByteBuffer slice = buffer.slice();
slice.limit(1);
target.accept(slice);
target.command();
buffer.position(1);
target.accept(buffer);
// do more with the buffer
buffer.get();
}
}
private interface Target {
void accept(ByteBuffer slice);
void command();
}
@Test
public void doSomething() {
final Stuff stuff = new Stuff();
final Target mockTarget = Mockito.mock(Target.class);
stuff.doSomething(mockTarget, ByteBuffer.wrap(new byte[]{1, 2, 3, 4}));
InOrder inOrder = Mockito.inOrder(mockTarget);
inOrder.verify(mockTarget).accept(ByteBuffer.wrap(new byte[]{1}));
inOrder.verify(mockTarget).command();
inOrder.verify(mockTarget).accept(ByteBuffer.wrap(new byte[]{2, 3, 4}));
}
}
如果doSomething
方法在末尾没有buffer.get();
的话,这就可以了
此测试失败,因为在调用inOrder.verify(mockTarget).accept(ByteBuffer.wrap(new byte[]{2, 3, 4}));
时,传入的参数已被随后的buffer.get()
调用修改
有没有办法在调用时验证缓冲区的内容
# 1 楼答案
选项A.如果很难测试,那么实现可能也有问题?每个
Target
都应该立即作用于这个缓冲区吗?也许我们只是在第二次调用中再交一个片段:选项B.不测试平台,只测试交互:
选项C.你自己的
ByteBuffer
的双重测试实现通常会给你完全的控制权,除非Buffer/ByteBuffer/HeapByteBuffer类层次结构不会像现在这样对测试不友好