往期文章
“Java并发程式设计”谈谈Java中的内存模型JMM面试官:说说你知道多少种执行绪池拒绝策略
为什么不要在MySQL中使用UTF-8编码方式
前言
很多公司都有写单元测试的硬性要求,在提交程式码的时候,如果单测通不过或者说单元测试各种覆盖率不达标,会被拒绝合并程式码。写单元测试,也是保证程式码质量的一种方式。junit单元测试
相信绝大多数的Java开发者都用过Junit来写单元测试。引入依赖:
junit
junit
4.12
直接在方法上加上@Test注解即可:

加了@Test注解,就会有一个执行的图示了。
spring的依赖问题
现在的Java开发,基本上离不开spring了。但是使用spring,写单测的时候就会存在一个依赖注入的问题。假设有如下一个Service:
@Service
public class TestService {
public String getString() {
return "Hello World!";
}
}
在Junit中直接自动装配:
public class JunitTest {
@Autowired
private TestService testService;
@Test
public void test() {
System.out.println(testService.getString());
}
}
执行报错:

springboot写单元测试
在springboot中,解决spring依赖问题,非常的简单。只需要它提供的几个注解即可:引入依赖:
org.springframework.boot
spring-boot-starter-test
test
这里引入了一个spring-boot-starter-test依赖,是springboot中写单测所需要的。
在单元测试类上新增@RunWith(SpringRunner.class)、@SpringBootTest注解:

这时候就可以正常的把spring依赖注入进来了,执行方法,可以看到springboot启动时的输出:

如果是通过spring initialize建立的springboot专案(本系列第一篇文章有讲解),其实会自动建立一个单元测试类:

我们在写单元测试的时候,直接继承这个类即可。
单元测试事务回滚
写单元测试,难免需要操作数据库。有时候单元测试的数据库跟开发时候的数据库是同一个,为了不影响数据库的资料,需要在单测完成之后,将操作回滚。这在springboot中也是很容易解决的事情,只需要将单测类继承AbstractTransactionalJUnit4SpringContextTests即可数据库有资料如下:

单元测试类如下:

测试方法如下:
@Test
public void deleteAll() {
userRepo.deleteAll();
}
执行方法后,如果事务不会滚,则会清除user表中的所有资料。

通过结果检视,单测执行没有问题,检视数据库:

资料也没有被删除,证明事务已经回滚了。
把继承的AbstractTransactionalJUnit4SpringContextTests类去掉,再次执行deleteAll方法:

数据库中的资料已被删除





























