我如何使用Mockito来验证带有ByteBuffer参数的调用?

问题描述 投票:2回答:1

我试图为一个使用了 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() 之后的调用。

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

java junit mockito bytebuffer
1个回答
1
投票

选项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类的层次结构不会像现在这样对测试不友好。

© www.soinside.com 2019 - 2024. All rights reserved.