在单元测试时,需要注入bean去进行测试,但是报空指针java.lang.NullPointerException。
这是因为类没有继承AbstractTestNGSpringContextTests类,导致没有注入实例的能力。
AbstractTestNGSpringContextTests这个类的作用:测试类只有继承了该类才拥有注入实例的能力。
@SpringBootTest
@Slf4j
public class TransferTest extends AbstractTestNGSpringContextTests {
@Autowired
public StudentService studentService;
@Test
public void testStudent(){
log.info("测试用例开始执行");
studentService.play();
Student student=new Student();
student.setName("小周");
student.setAge(12);
System.out.println(student.getAge());
}
}
接着执行,但新的问题又来了
问题是说,StudentService这个bean没有装配成功,啥都不说了,注解都加了,到底是啥原因呢?百度吧。
找到了下面这句话,仔细体会下(画重点,必考!)
根据上面说的,那就好解决了,要么把service和dao放在可扫描的包下,要么在@SpringBootApplication注解后加入扫描包的范围,比如下面这种(忽略包名的命名)
@SpringBootApplication(scanBasePackages = {"com.test.dto"})
再次执行,完美运行。
@SpringBootTest
一般情况下,使用@SpringBootTest后,Spring将加载所有被管理的bean,基本等同于启动了整个服务,此时便可以开始功能测试。
将SpringBoot主类中导入的bean全都包含进来,SpringBoot主类中的bean就是你标记的@SpringBootApplication的类中有哪些bean
@MybatisTest @AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
使用@MybatisTest,如果不加注解@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE),那么mybatis使用的是内存数据库,并不是真实的tddl的数据库,会报表不存在的错
其实上面也提到了,如果使用@SpringBootTest时,会启动整个服务,这样太耗时了,如果我们只是想测试某个类呢?那就用@MybatisTest
@ContextConfiguration
这个注解如果()内有class文件,会优先扫描带有class文件中的bean,不然扫描@Configuration的类,最后扫描@SpringBootApplication
@ContextConfiguration
这个注解通常与@RunWith(SpringJUnit4ClassRunner.class)
联合使用用来测试
当一个类添加了注解@Component
,那么他就自动变成了一个bean,就不需要再Spring配置文件中显示的配置了。把这些bean收集起来通常有两种方式,Java的方式和XML的方式。当这些bean收集起来之后,当我们想要在某个测试类使用@Autowired
注解来引入这些收集起来的bean时,只需要给这个测试类添加@ContextConfiguration
注解来标注我们想要导入这个测试类的某些bean。