Mockito - 存根方法时出现 NullpointerException

新手上路,请多包涵

所以我开始为我们的 Java-Spring-project 编写测试。

我使用的是 JUnit 和 Mockito。据说,当我使用 when()…thenReturn() 选项时,我可以模拟服务,而无需模拟它们左右。所以我想做的是,设置:

 when(classIwantToTest.object.get().methodWhichReturnsAList(input))thenReturn(ListcreatedInsideTheTestClass)

但无论我执行哪个 when 子句,我总是会得到一个 NullpointerException,这当然是有道理的,因为输入为空。

此外,当我尝试从对象模拟另一种方法时:

 when(object.method()).thenReturn(true)

在那里我还得到了一个 Nullpointer,因为该方法需要一个未设置的变量。

但我想使用 when()..thenReturn() 来绕过创建这个变量等等。我只是想确保,如果任何类调用此方法,那么无论如何,只返回 true 或上面的列表。

这基本上是我的误解,还是有其他问题?

代码:

 public class classIWantToTest implements classIWantToTestFacade{
        @Autowired
        private SomeService myService;

        @Override
        public Optional<OutputData> getInformations(final InputData inputData) {
            final Optional<OutputData> data = myService.getListWithData(inputData);
            if (data.isPresent()) {
                final List<ItemData> allData = data.get().getItemDatas();
                    //do something with the data and allData
                return data;
            }

            return Optional.absent();
        }
}

这是我的测试课:

 public class Test {

    private InputData inputdata;

    private ClassUnderTest classUnderTest;

    final List<ItemData> allData = new ArrayList<ItemData>();

    @Mock
    private DeliveryItemData item1;

    @Mock
    private DeliveryItemData item2;

    @Mock
    private SomeService myService;

    @Before
    public void setUp() throws Exception {
        classUnderTest = new ClassUnderTest();
        myService = mock(myService.class);
        classUnderTest.setService(myService);
        item1 = mock(DeliveryItemData.class);
        item2 = mock(DeliveryItemData.class);

    }

    @Test
    public void test_sort() {
        createData();
        when(myService.getListWithData(inputdata).get().getItemDatas());

        when(item1.hasSomething()).thenReturn(true);
        when(item2.hasSomething()).thenReturn(false);

    }

    public void createData() {
        item1.setSomeValue("val");
        item2.setSomeOtherValue("test");

        item2.setSomeValue("val");
        item2.setSomeOtherValue("value");

        allData.add(item1);
        allData.add(item2);

}

原文由 user5417542 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1k
2 个回答

您尚未存根的方法的默认返回值是 false 对于布尔方法,一个空的集合或映射对于返回集合或映射的方法和 null 否则。

这也适用于 when(...) 中的方法调用。在您的示例 when(myService.getListWithData(inputData).get()) 将导致 NullPointerException 因为 myService.getListWithData(inputData)null - 它之前没有被存根。

一种选择是为所有中间返回值创建模拟,并在使用前存根它们。例如:

 ListWithData listWithData = mock(ListWithData.class);
when(listWithData.get()).thenReturn(item1);
when(myService.getListWithData()).thenReturn(listWithData);

或者,您可以在创建模拟时指定不同的默认答案,以使方法返回新模拟而不是 null: RETURNS_DEEP_STUBS

 SomeService myService = mock(SomeService.class, Mockito.RETURNS_DEEP_STUBS);
when(myService.getListWithData().get()).thenReturn(item1);

您应该阅读 Mockito.RETURNS_DEEP_STUBS 的 Javadoc,其中更详细地解释了这一点,并且对其用法也有一些警告。

我希望这有帮助。请注意,您的示例代码似乎有更多问题,例如缺少断言或验证语句以及在模拟上调用设置器(这没有任何效果)。

原文由 ahu 发布,翻译遵循 CC BY-SA 3.0 许可协议

我有这个问题,我的问题是我用 any() 而不是 anyInt() 调用我的方法。所以我有:

 doAnswer(...).with(myMockObject).thisFuncTakesAnInt(any())

我不得不将其更改为:

 doAnswer(...).with(myMockObject).thisFuncTakesAnInt(anyInt())

我不知道为什么会产生 NullPointerException。也许这会帮助下一个可怜的灵魂。

原文由 Ryan Shillington 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏