You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用JUnit测试代码中的try-catch代码块?

如何用Mockito触发方法的catch分支并覆盖代码

首先,咱们先理清你当前测试没进入catch块的核心问题:你的测试用例里用when(sMock.getAll()).thenReturn(null),这只会让mock返回null,但不一定会触发Exception——除非你的try块里对这个null结果做了调用方法之类的操作才会抛出NPE,但如果只是返回null本身,大概率不会触发异常。另外你用了@Test(expected=NullPointerException.class),但你的方法里已经用catch块捕获了所有Exception,这个异常根本不会抛出到测试方法层面,所以这个注解反而会让测试失败。

要直接触发catch块,你应该让mock的方法主动抛出异常,而不是返回null。下面是修正后的测试步骤和代码:

正确的测试用例写法

  1. 让mock的getAll()方法抛出指定异常(比如NullPointerException,或者你想测试的其他异常类型)
  2. 调用被测试的get()方法
  3. 验证返回的ResponseEntity状态码是HttpStatus.INTERNAL_SERVER_ERROR
@Test
public void testGet_WhenExceptionThrown_ReturnsInternalServerError() {
    // 第一步:让mock抛出异常,可替换为任意你想测试的Exception子类
    when(sMock.getAll()).thenThrow(new NullPointerException());
    
    // 第二步:调用被测试类的目标方法(替换成你的被测试类实例)
    ResponseEntity result = yourTestClass.get(); 
    
    // 第三步:验证返回结果符合预期
    Assert.assertEquals(HttpStatus.INTERNAL_SERVER_ERROR, result.getStatusCode());
}

额外注意点

  • 别再用@Test(expected=...):因为你的方法已经捕获了异常,不会向外抛出,这个注解会导致测试失败,因为测试方法根本接收不到异常。
  • 如果你想测试多种异常场景(比如不同的Exception类型),可以写多个测试用例,分别让mock抛出不同异常,验证返回结果是否符合业务逻辑。
  • 确保你的被测试类实例已经正确注入了mock的sMock对象(比如用@InjectMocks注解完成依赖注入)。

这样调整后,你的测试用例就会触发try-catch里的catch分支,代码覆盖率也会包含这个部分啦。

内容的提问来源于stack exchange,提问作者jamuna

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:17:30