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()
之后的调用修改。
有没有办法在调用时验证该缓冲区的内容?
解决方案
选项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
通常会给您完全控制,除非 Buffer/ByteBuffer/HeapByteBuffer 类层次结构不像它那样对测试不友好。
推荐阅读
- ios - 如何更改 UICollectionViewCell 初始布局位置?
- python - SQLAlchemy:用存储过程或更复杂的 sql 语句填充对象
- javascript - xhr GET 请求仅在 iframe 中返回 406
- java - ORA-00933 SQL 命令未正确结束但在 SQL Developer 中运行良好
- angular - 完成 Observable.create() 时是否需要(或推荐)observer.complete()
- laravel - Laravel 检查路由是否使用宏
- node.js - 如何为 React 提供 index.html 并在相同路径处理路由?
- spring-boot-actuator - 从 Spring boot 2 导出的 Micrometer 指标的 Dynatrace 可视化
- swift - 停止旧动画并开始新动画,一旦我改变片段,迅速
- hive - 如何使用子查询在 hive 中加入?