Mockito возвращает разные значения для метода-заглушки из списка, который у меня есть в тестовом примере - PullRequest
0 голосов
/ 08 июля 2020

Я получаю исключение с нулевым указателем для этой части имитации метода-заглушки для возврата из списка. Мой inputProvider - это шпионский метод mockito. Этот метод testCase вызывается многими тестовыми методами аналогичных тестовых случаев.

private void testCase(String config, String orders, List<String> outputs){
        try {
            CoffeeMachineRunner machineRunner = new CoffeeMachineRunner();
            when(inputProvider.getConfigInput()).thenReturn(config);
            List<Order> orderList = getOrderFromJson(orders);
            Iterator<Order> it = orderList.iterator();
            when(inputProvider.hasNextInput()).thenAnswer(new Answer<Boolean>() {
                private Iterator<Order> iterator = it;
                @Override
                public Boolean answer(InvocationOnMock invocation) throws Throwable {
                    return iterator.hasNext();
                }
            });
            when(inputProvider.getNextInput()).thenAnswer(new Answer<Order>() {
                private Iterator<Order> iterator = it;
                @Override
                public Order answer(InvocationOnMock invocation) throws Throwable {
                    return iterator.next();
                }
            });
            machineRunner.simulate(inputProvider);
            assertStringIn(outputs, outContent.toString());
        } catch (Exception e) {
            assertTrue(false);
        }
    }

В основном, как мне вернуть значение из этого списка с помощью общего итератора по двум вызовам метода. hasNext и getNext?

1 Ответ

0 голосов
/ 08 июля 2020

Попробуйте сделать итератор final и использовать его в ответе

private void testCase(String config, String orders, List<String> outputs){
        try {
            CoffeeMachineRunner machineRunner = new CoffeeMachineRunner();
            when(inputProvider.getConfigInput()).thenReturn(config);
            List<Order> orderList = getOrderFromJson(orders);
            final Iterator<Order> iter = orderList.iterator();
            doAnswer(new Answer<Boolean>() {
                @Override
                public Boolean answer(InvocationOnMock invocation) throws Throwable {
                    return iter.hasNext();
                }
            }).when(inputProvider).hasNextInput();

            doAnswer(new Answer<Order>() {
                @Override
                public Order answer(InvocationOnMock invocation) throws Throwable {
                    return iter.next();
                }
            }).when(inputProvider).getNextInput();

            machineRunner.simulate(inputProvider);

            assertStringIn(outputs, outContent.toString());
        } catch (Exception e) {
            assertTrue(false);
        }
    }

From JDK-8 + с использованием Lambda

private void testCase(String config, String orders, List<String> outputs){
        try {
            CoffeeMachineRunner machineRunner = new CoffeeMachineRunner();
            when(inputProvider.getConfigInput()).thenReturn(config);
            List<Order> orderList = getOrderFromJson(orders);
            final Iterator<Order> iter = orderList.iterator();

            doAnswer(invocation -> iter.hasNext()).when(inputProvider).hasNextInput();
            doAnswer(invocation -> iter.next()).when(inputProvider).getNextInput();

            machineRunner.simulate(inputProvider);

            assertStringIn(outputs, outContent.toString());
        } catch (Exception e) {
            assertTrue(false);
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...