有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  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的双重测试实现通常会给你完全的控制权,除非Buffer/ByteBuffer/HeapByteBuffer类层次结构不会像现在这样对测试不友好