当前位置: 首页 > 知识库问答 >
问题:

截尾方法时的Mockito-NullPointerException

洪逸清
2023-03-14

所以我开始为我们的Java-spring项目写测试。

我用的是JUnit和Mockito。据说,当我使用when()...thenreturn()选项时,我可以模拟服务,而不需要模拟它们。所以我想做的是,设定:

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

但是无论我做哪个when-clause,我总是得到一个NullpointerException,这当然是有意义的,因为input是null。

同样,当我试图从一个对象模拟另一个方法时:

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

下面是我的测试类:

html" target="_blank">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);


}

共有3个答案

华子航
2023-03-14

我也遇到了同样的问题,我的问题只是没有正确地使用@RunWith对类进行注释。在您的示例中,请确保您具有:

@RunWith(MockitoJUnitRunner.class)
public class Test {
...

一旦我这样做了,NullPointerExceptions就消失了。

东弘扬
2023-03-14

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

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

我不得不把它改成:

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

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

汪阳飇
2023-03-14

对于布尔方法,您尚未截尾的方法的默认返回值为false,对于返回集合或映射的方法,默认返回值为空集合或映射,否则为null

这也适用于中的方法调用(...)。在您的示例中,When(MyService.GetListWithData(inputData).Get())将导致NullPointerException,因为MyService.GetListWithData(inputData)Null-以前没有将其挂起。

一个选项是为所有中间返回值创建mock,并在使用之前将它们存根。例如:

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,它对此进行了更详细的解释,并对其用法提出了一些警告。

希望这能帮上忙。只需注意,您的示例代码似乎有更多的问题,例如缺少assert或verify语句以及在模拟上调用setter(这没有任何影响)。

 类似资料:
  • 使用或,是否有任何方法可以拦截对对象的非静态方法的调用,或者至少是对单例对象的非静态方法的调用? 以下类提供了一个示例: 但是,上面的类只提供了一个私有构造函数,因此不能对其进行扩展。使用返回部分模拟(spy)也不会起作用,因为类不提供无参数构造函数。 想要的嘲弄能以其他任何方式实现吗?对于非单例类可以这样做吗?

  • 问题内容: 因此,我开始为我们的Java Spring项目编写测试。 我使用的是JUnit和Mockito。有人说,当我使用when()… thenReturn()选项时,可以模拟服务,而无需模拟它们。所以我要做的是设置: 但是无论我执行哪一个子句,我总会得到一个NullpointerException,这当然是有道理的,因为input为null。 另外,当我尝试从对象模拟另一个方法时: 在那里,

  • 我有一个工厂接口B,它返回类型a的对象。类型a也是一个接口。 我很难弄清楚如何在模拟中为.doSomething()定义方法行为,因为每当工厂返回一个新的实例时,它都需要知道如何doSomething()。 这就是我到目前为止嘲笑工厂的地方,但是A不知道如何做()。 是否有某种方法可以为将返回的所有实例定义。doSomething()? 非常感谢任何帮助。

  • 我正在用Mockito为一个项目设置jUnit测试。在被测系统(DrawingService)中调用方法时遇到问题。模拟包括图形和IDrawingRepository。 我不熟悉TDD、单元测试和一般的模拟,所以我可能犯了一些noob错误?任何帮助都将不胜感激。 以下是测试课程: 以下是正在测试的系统:

  • 问题内容: 我正在使用Mockito测试旧版JAAS / LDAP登录模块。 该接口定义了以下功能: 我期望包含一个,这是需要进行操作才能通过测试的对象。 有没有一种方法可以有效地对此进行模拟,或者我可以通过实施存根实现更好呢? 问题答案: 对于返回的函数,请使用doAnswer() 和执行拦截必须在作为参数,例如,作为一个匿名类: 在这种情况下将是数组!

  • 我有一个类,它有两个方法。我想模拟这个类,然后模拟第一个方法,但不是第二个。 例如。 单元测试代码: 奇怪的是m2没有被调用。 我错过什么了吗?