首页 > 解决方案 > 如何使用 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()之后的调用修改。

有没有办法在调用时验证该缓冲区的内容?

标签: javajunitmockitobytebuffer

解决方案


选项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 类层次结构不像它那样对测试不友好。


推荐阅读