Как я могу использовать Mockito для проверки вызовов с аргументами ByteBuffer? - PullRequest
3 голосов
/ 22 апреля 2020

Я пытаюсь создать тест для библиотеки, которая использует 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 голос
/ 22 апреля 2020

Вариант А. Если тестирование сложно, может быть, есть проблема с реализацией? Каждый 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 не будет столь же непривлекательной для тестирования, как и сейчас.

...