JUnit 5与Mockito中assertThrows()抛出NullPointerException而非预期异常
问题原因及解决方案
问题根源
测试类中错误使用@Spy和@InjectMocks注解创建MyService实例是核心问题。MyService是无依赖的简单类,完全不需要Mockito的代理对象(Spy)参与测试。Spy的代理机制会干扰真实方法执行逻辑,导致传入null参数时,Mockito代理层提前抛出NullPointerException,并未进入你编写的invoke方法的空值判断逻辑。
修复方案
移除所有Mockito相关注解,直接实例化MyService对象即可完成测试:
import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertThrows; public class AxwApplicationTest { private MyService myServiceToTest = new MyService(); @Test public void invoke_ShouldThrow_MyCustomException() { assertThrows(MyCustomException.class, () -> { myServiceToTest.invoke(null); }); } }
额外说明
如果后续MyService需要依赖其他类,再考虑使用@InjectMocks配合@Mock注入依赖。当前场景下,Maven依赖中的mockito-core、mockito-junit-jupiter、mockito-inline都是多余的,仅保留junit-jupiter-api即可完成测试。
内容的提问来源于stack exchange,提问作者Michi-2142
相关产品推荐
相关产品推荐

