迁移PowerMockito至Mockito(JUnit5):测试InputStream入参方法遇NPE求助
解决JUnit 5 + Mockito环境下InputStream传递为null的问题
可能的问题根源
IOUtils.toInputStream创建流时因依赖缺失或参数问题返回nullinjectMockObj未被正确注入(比如未使用@InjectMocks注解,或依赖Mock未初始化)- 测试代码中流创建后被意外修改为null
解决方案
方案1:用JDK原生类创建InputStream(无第三方依赖)
直接使用ByteArrayInputStream创建非空流,避免依赖Apache Commons IO的潜在问题:
@ExtendWith(MockitoExtension.class) public class TestClass { @InjectMocks private YourTargetClass injectMockObj; // 替换为实际要测试的类 @Mock private YourTargetClass.Dependency mockDependency; // 类的依赖Mock @Test void testMethod() { // 用JDK原生方式创建非空InputStream InputStream inputStream = new ByteArrayInputStream("test data".getBytes(StandardCharsets.UTF_8)); // 断言流非空,提前排查创建问题 assertNotNull(inputStream); injectMockObj.methodToTest(inputStream, "abc.xlsx"); } }
方案2:修复IOUtils的使用(若坚持用第三方工具)
确保已引入Apache Commons IO依赖,并且指定字符集参数(避免默认字符集导致的异常):
@Test void testMethod() { // 明确指定字符集,避免潜在的编码问题 InputStream inputStream = IOUtils.toInputStream("test data", StandardCharsets.UTF_8); assertNotNull(inputStream); injectMockObj.methodToTest(inputStream, "abc.xlsx"); }
方案3:验证Mockito注入正确性
确保injectMockObj通过@InjectMocks正确注入,且类的所有依赖都用@Mock注解声明,MockitoExtension会自动完成初始化,无需手动在setup方法中创建实例。
关键调试步骤
- 在创建流后立刻添加
assertNotNull(inputStream),确认流本身非空 - 检查
injectMockObj是否为null(可添加断言assertNotNull(injectMockObj)) - 若方法内仍出现NPE,可在
methodToTest入口处打印参数,排查是否是参数传递过程中被篡改
内容的提问来源于stack exchange,提问作者Khushi
相关产品推荐
相关产品推荐

