JUnit测试未覆盖try-catch代码块问题求助
覆盖try-catch代码块的单元测试方案
针对你提供的setKey方法,要覆盖catch块中的NoSuchAlgorithmException和UnsupportedEncodingException分支,需要通过mock技术触发这两个异常——因为这两个异常在正常运行环境下几乎不会出现。以下是具体实现方案:
1. 覆盖UnsupportedEncodingException分支
UTF-8是Java标准支持的字符编码,正常调用myKey.getBytes("UTF-8")不会抛出异常。需要借助PowerMock(或Mockito的静态mock功能)拦截String.getBytes()方法,强制抛出异常:
import org.junit.Test; import org.junit.runner.RunWith; import org.powermock.api.mockito.PowerMockito; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; import java.io.UnsupportedEncodingException; @RunWith(PowerMockRunner.class) @PrepareForTest(YourClass.class) // 替换为你的类名 public class YourClassTest { @Test public void testSetKey_ThrowsUnsupportedEncoding() throws Exception { YourClass testInstance = new YourClass(); String testKey = "test-key"; // mock指定字符串的getBytes方法,抛出UnsupportedEncodingException PowerMockito.when(testKey.getBytes("UTF-8")).thenThrow(new UnsupportedEncodingException()); testInstance.setKey(testKey); // 可选:验证logger是否输出了错误日志,需提前mock logger对象 } }
2. 覆盖NoSuchAlgorithmException分支
SHA-256是Java标准提供的消息摘要算法,正常调用MessageDigest.getInstance("SHA-256")不会抛出异常。需要mock这个静态方法,强制抛出异常:
import org.junit.Test; import org.junit.runner.RunWith; import org.powermock.api.mockito.PowerMockito; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; @RunWith(PowerMockRunner.class) @PrepareForTest({YourClass.class, MessageDigest.class}) public class YourClassTest { @Test public void testSetKey_ThrowsNoSuchAlgorithm() throws Exception { YourClass testInstance = new YourClass(); // mock MessageDigest的静态方法,抛出NoSuchAlgorithmException PowerMockito.mockStatic(MessageDigest.class); PowerMockito.when(MessageDigest.getInstance("SHA-256")).thenThrow(new NoSuchAlgorithmException()); testInstance.setKey("any-key"); // 可选:验证logger.error方法是否被正确调用 } }
补充提示
- 若使用JUnit 5,可改用Mockito 3.4+的
Mockito.mockStatic方法实现静态mock,无需依赖PowerMock - 要验证catch块中的日志逻辑,需提前通过Mockito.spy或@Mock注解mock logger对象,然后验证
logger.error的调用参数和次数
内容的提问来源于stack exchange,提问作者Antonio Xavier de Sousa Neto
相关产品推荐
相关产品推荐

