java后端用mockito做单元测试,一直报错空指针问题【已解决】

项目场景:

写java后端,用mockito做单元测试


问题描述

跑测试代码的时候,一直报空指针错:
在这里插入图片描述
测试代码如下:

@RunWith(MockitoJUnitRunner.class)
public class RuleServiceImplTest {
    @InjectMocks
    private RuleServiceImpl ruleService;

    @Mock
    private RuleMapper mockRuleMapper;

    @Before
    public void setup(){
        MockitoAnnotations.initMocks(this);
    }

    @Test
    void addRule() {
        RuleVO ruleVO1=new RuleVO(13,1,2,3,4,5,4,0);
        Rule rule1=new Rule(ruleVO1);
        Mockito.when(mockRuleMapper.insert(rule1)).thenReturn(1); #报错行
        Assert.assertEquals(resultVO1.getCode(), Constant.REQUEST_SUCCESS);
    }
}

debug发现 ruleService 和 mockRuleMapper 为空:
在这里插入图片描述

一开始以为是测试代码哪写错了,作为一个后端小白,在网上搜索相关bug解决办法,乃至询问身边写过测试的人,前前后后弄了好几个小时,还是一直报错空指针


原因 & 解决方案:

最后仔细对比,我才发现是import的时候出了问题,在写到注释@Test的时候,idea自动帮我import了,结果import错了

错误版本:
在这里插入图片描述
正确版本:
在这里插入图片描述


反思:

首先是经验太少(cai 了,这种错误竟然都没有发现,其次是太相信idea了,完全没想到会import错,下午这几个小时就这样没了

在这里插入图片描述

  • 26
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
单元测试中,捕获并处理空指针异常是一种常见的法。使用try-catch块可以防止测试失败并继续执行其他测试。在使用Mockito进行单元测试时,如果你预计某些方法可能会引发空指针异常,你可以在测试方法中使用try-catch块来捕获并处理这些异常。 以下是一个示例,展示了如何在Mockito单元测试中捕获和处理空指针异常: ```java import static org.mockito.Mockito.*; import org.junit.Test; public class MyUnitTest { @Test public void myTest() { // 创建一个 mock 对象 MyClass myClassMock = mock(MyClass.class); // 设置 mock 对象的行为 when(myClassMock.method()).thenThrow(NullPointerException.class); try { // 调用被测试的方法,可能会引发空指针异常 myClassMock.method(); } catch (NullPointerException e) { // 在这里处理异常,例如打印日志或进行其他操作 // ... } // 进行断言或其他验证操作 // ... } } ``` 在这个例子中,我们创建了一个名为`myClassMock`的`MyClass`的Mock对象,并设置了当调用`method()`方法时抛出空指针异常。然后,在try-catch块中调用被测试的方法并捕获异常。你可以在catch块中执行自定义的操作,比如打印日志或进行其他处理。 请注意,这种法适用于一些特定情况,比如你无法修改被测试的代码或者你希望测试方法的其他部分继续执行。但是,在大多数情况下,更好的法是避免引发空指针异常,通过适当的测试用例设计和Mock对象的设置来确保代码的正确性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值