spring框架环境搭建完成后,在test文件中新建测试类TxTest,测试方法中使用@Autowired
注解注入AccouService
对象失败,报错空指针异常java.lang.NullPointerException
public class TxTest {
@Autowired
private AccountService accountService;
@Test
public void test01()
{
accountService.accountMoney();
System.out.println(accountService.listAll());
}
}
报错如下:
java.lang.NullPointerException
at TxTest.test01(TxTest.java:22)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:59)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:56)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
at org.junit.runners.BlockJUnit4ClassRunner$1.evaluate(BlockJUnit4ClassRunner.java:100)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:366)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:103)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:63)
at org.junit.runners.ParentRunner$4.run(ParentRunner.java:331)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:79)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:329)
at org.junit.runners.ParentRunner.access$100(ParentRunner.java:66)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:293)
at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
at org.junit.runners.ParentRunner.run(ParentRunner.java:413)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33)
at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:230)
at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:58)
但通过getBean()
方法手动获取容器中的AccouService
对象没有问题
public class TxTest {
@Test
public void test01()
{
ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
AccountService bean1 = ac.getBean(AccountService.class);
System.out.println(bean1.listAll());
}
}
运行结果成功,打印连接数据库后查询所有记录的结果:
七月 17, 2021 1:59:54 下午 com.alibaba.druid.support.logging.JakartaCommonsLoggingImpl info
信息: {dataSource-1} inited
[Account{id=1, name='Lucy', age=18, gender=1, total=900.0}, Account{id=2, name='Marry', age=25, gender=0, total=1100.0}]
说明数据库数据源等配置没有问题,解决Junit测试中无法使用@Autowired
注解注入对象方式如下:
- 导入spring整合junit测试的jar包
注意使用spring5.x时对应的JUnit版本必须是4.12以上<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13</version> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>5.2.4.RELEASE</version> </dependency>
- 在测试类上加上两个注解
- JUit4版本用法:
@RunWith(SpringJUnit4ClassRunner.class)
,开启spring-junit测试环境@ContextConfiguration(locations = "classpath:applicationContext.xml")
- 基于xml的配置:使用locations属性填写xml文件所在位置
- 基于注解的配置:使用classes属性填写配置类字节码文件名称
- JUnit5版本用法:
@ExtendWith(SpringExtention.class)
@ContextConfiguration(classes = TxConfig.class)
- 可以使用一个复合注解替换以上两个注解:
@SpringJUnitConfig(locations="classpath:applicationContext.xml")
更改后测试代码如下:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:applicationContext.xml")
public class TxTest {
@Autowired
private AccountService accountService;
@Test
public void test01()
{
accountService.accountMoney();
System.out.println(accountService.listAll());
}
}
JUnit5依赖引入:
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.7.0</version>
<scope>test</scope>
</dependency>
JUnit5测试类及注解使用方式:
//@ExtendWith(SpringExtension.class)
//@ContextConfiguration(locations = "classpath:applicationContext.xml")
//以上两个注解可以用下面一个注解替代
@SpringJUnitConfig(locations = "classpath:applicationContext.xml")
public class JUnit5Test {
@Autowired
AccountService accountService;
@Test
public void test() {
accountService.accountMoney();
System.out.println(accountService.listAll());
}
}
运行正常,不再出现空指针异常。
参考视频:尚硅谷-Spring5框架最新版教程P52-整合JUnit5新功能
参考博客:Junit中@Autowired失效