使用场景
- 在编写SSM项目的时候,我们一般编写的顺序都是先是持久层,再是业务层,再是控制层,即先编写mapper.java接口以及对应的mapper.xml文件, 再编写service.java接口以及对应的serviceImpl.java实现类最后写controller.java即控制器。
- 但是我们如果全部写完三层之后运行之后发现程序报错或者有bug的时候就比较难去找错,对于修改的地方可能也比较多,所以我建议一般写完持久层和业务层就先去测一下所有的功能是否有效,确定有效不报错的时候再去编写controller层,再创建页面去测试.
遇到的问题
- 我们如何在SSM整合的环境中去测?我们一般写业务层的时候会在对应service的实现类上面加一个注解@Service,即让Spring自动为我们创建业务层对象,我们有没有什么简单的方法来获取到该对象,并通过service实现类对象来调用数据访问层对象来实现功能的测试?
解决方法
- maven项目中在src/test/java下创建一个java类作为我们的测试类
- 在pom.xml文件中添加测试需要使用到的相关依赖
spring中的测试依赖(我使用的版本是5.3.16,其他版本也可以)
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.3.16</version>
</dependency>
junit测试单元依赖(版本最好要高于4.11)
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
- 在测试类中编写测试方法:
在测试类上使用注解@RunWith(SpringJUnit4ClassRunner.class),相当于启动Spring容器,根据@Service注解,会自动创建Service对象,
在测试类上使用注解@ContextConfiguration(locations ={Spring配置文件的位置,可以写多个,用逗号分隔开 } ),作用是相当于读取Spring的配置文件
比如:
//相当于读取配置文件
@ContextConfiguration(locations = {“classpath:applicationContext.xml”,“classpath:applicationContext_service.xml”})
有了上面两个注解就相当于已经启动了Spring容器,并且已经创建好了service实现类对象,以及mapper接口的实现类对象,所以可以直接使用了
//相当于启动Spring容器,会自动创建Service对象,根据注解
@RunWith(SpringJUnit4ClassRunner.class)
//相当于读取配置文件,我有两个配置文件,所以都要传进去
@ContextConfiguration(locations = {"classpath:applicationContext.xml","classpath:applicationContext_service.xml"})
public class UserTest {
//此时就可以用自动注入将Spring创建的service注入进来
@Autowired
UserService userService;
@Test
//我测试的方法是查找所有用户信息
public void testFindAll(){
//此时就可以使用service对象来调用数据访问层进行验证
System.out.println(userService.findAll());
}
}
运行testFindAll()函数,并查看控制台输出,完成测试
输出正常,说明该功能是有效的,同理其他功能都这样一 一测试,确定无误就可以写controller层了。