【问题标题】:Mockito return different values for a stub method from a list i have in test caseMockito 从我在测试用例中的列表中为存根方法返回不同的值
【发布时间】:2020-07-08 18:43:16
【问题描述】:

在模拟存根方法以从列表返回的这一部分中,我得到了空指针异常。我的inputProvider 是一种模拟间谍方法。这个方法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 ?

【问题讨论】:

    标签: java testing mockito


    【解决方案1】:

    尝试制作迭代器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);
            }
        }
    

    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);
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-02
      • 1970-01-01
      • 2017-05-12
      • 2015-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多