对一个Java开发人员来说,单元测试是我们编码过程中不可或缺的一部分了。单元测试让你关注软件的基本单元的正确性,可以在编码阶段就提前暴露代码缺陷;单元测试具有执行速度快、可复用性的特点;单元测试可以让你进行代码重构时更加从容。所以越是核心的代码,进行单元测试越有必要。
很多人觉得单元测试很重要,但是很多人都做不好单元测试,尤其是在集成了spring框架的项目,很多人都不知道怎么方便快捷的进行单元测试。在集成了spring的项目中你是否有这样的困扰,每次执行一个test case你就必须等待spring容器加载环境长达十几秒,对于追求效率的你来说简直是个噩梦。下面我提出两种方法让你的单元测试更加方便。
使用spring-boot-test-starter做单元测试spring-boot-test-starter集成了Junit5、Mockito、Spring Test等工具可以让你在spring的环境下非常方便的做单元测试,在spring环境下做测试你可以方便的使用依赖注入方式完成单元测试,更重要的是使用pring-boot-test-starter做单元测试只要你想,你可以只需要加载你感兴趣的一个或者几个java bean进spring容器直接开始测试而不需要将所有环境准备好,加载所有的bean。请看下面的例子:
@Service
public class Demo1{
public Boolean test(){
//do something
}
}
@Service
public class Demo{
@Autowired
private Demo1 demo1;
public Boolean doInvoke() {
//do something
}
}
@SpringBootTest(classes=Demo.class)
public class demoTest{
@Autowired
private Demo demo;
@MockBean
private Demo1 demo1;
@Test
public void test() {
BDDMockito.given(demo1.test).willReturn(true);
Boolean result = demo.doInvoke();
Assertions.assertTrue(result);
}
}
可以看到我们使用@SpringBootTest注解,并且属性上注明了classes=Demo.class,意思就是说只将Demo这个类加载到spring容器中,因为我们只关注这个类的单元测试,其他类我们不关心一律mock掉。这样是不是很方便,再也不会因为某个数据库挂了,某个资源加载不到影响单元测试的执行,更不用等spring慢腾腾的把所有bean加载再执行了。
不要在你的单元测试中引入Spring还有一种方式就是干脆不要在你的单元测试中使用Spring,这种方式同样可以解决因为spring加载环境慢的原因而导致单元测试慢的问题。同样我们用上面例子改造下:
@Service
public class Demo1{
public Boolean test(){
//do something
}
}
@Service
public class Demo{
private Demo1 demo1;
public Demo(Demo1 demo1) {
this.demo1=demo1;
}
public Boolean doInvoke() {
//do something
}
}
@RunWith(MockitoJUnitRunner.class)
public class DemoTest{
@Mock
private Demo1 demo1;
@InjectMocks
private Demo demo;
@Test
public void test() {
BDDMockito.given(demo1.test).willReturn(true);
Boolean result = demo.doInvoke();
Assertions.assertTrue(result);
}
}
注意上面单元测试已经没有使用spring了,取而代之的是将单元测试运行在MockitoJunit环境,以便启用mockito的注解。



