如何使用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。下面是修正后的测试步骤和代码:
正确的测试用例写法
- 让mock的
getAll()方法抛出指定异常(比如NullPointerException,或者你想测试的其他异常类型) - 调用被测试的
get()方法 - 验证返回的
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
相关产品推荐
相关产品推荐

