我如何使用Mockito来验证带有ByteBuffer参数的调用?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我如何使用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()
之后的调用。
有没有办法在调用时验证该缓冲区的内容?
答案
选项A.如果很难测试,可能也是实现上有问题?是不是每个 Target
应该立即对这个缓冲区采取行动?也许我们只是在第二次调用时再交出一个片子。
target.accept(buffer.slice());
选项B: 不要测试平台,只测试交互。
@Test
public void doSomething1() {
final Stuff stuff = new Stuff();
final Target mockTarget = mock(Target.class);
final ByteBuffer buffer = mock(ByteBuffer.class);
final ByteBuffer slice = mock(ByteBuffer.class);
given(buffer.slice()).willReturn(slice);
stuff.doSomething(mockTarget, buffer);
final InOrder inOrder = Mockito.inOrder(mockTarget);
inOrder.verify(mockTarget).accept(slice);
inOrder.verify(mockTarget).command();
inOrder.verify(mockTarget).accept(buffer);
}
选项C. 你自己的测试双重实现 ByteBuffer
通常会给你完全的控制权,除非BufferByteBufferHeapByteBuffer类的层次结构不会像现在这样对测试不友好。
以上是关于我如何使用Mockito来验证带有ByteBuffer参数的调用?的主要内容,如果未能解决你的问题,请参考以下文章