我如何使用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参数的调用?的主要内容,如果未能解决你的问题,请参考以下文章

Mockito - 验证对象根本没有被调用

如何使用 mockito verify() 调用两次方法来验证方法

Mockito:您如何验证某些方法调用组的组顺序?

使用 Mockito 的通用“any()”方法

使用 Mockito 未调用 Object 参数的验证方法

mockito 验证未使用参数调用的方法