SpringBoot项目中写单测时,通常要启动Spring等环境,为了测试一个简单的代码模块都要加载一大堆环境,导致测试速度慢。
单元测试应小而轻,提高测试效率,较少对外部的依赖,比如数据库、Spring容器、网络服务等,而只关心我们自己的代码,通过Mock来解决对外部的依赖。
如何优化单元测试方法呢?
1.不使用@Autowired,就是这个注解启动了Spring。在启动Spring IOC容器时,容器会自动装载一个AutowiredAnnotationBeanPostProcessor后置处理器,当容器扫描到@Autowired、@Resource或@Inject时,就会在IOC容器自动查找需要的bean,并装配给该对象的属性。
2.不应使用@SpringBootTest,每次都会启动SpringBoot环境,导致单测很慢
3.不应调用数据库,单测应该尽可能的和数据库分离
4.应使用Assert断言
如何写好单元测试?
Mockito的使用
B站TDD-Mock视频
单测实例:
@RunWith(SpringRunner.class)
public class RpcRuleServiceTest{
//创建一个实例,会注入Mock变量
@InjectMocks
private RpcRuleService rpcRuleService = new RpcRuleServiceImpl();
//相关操作会被Mock掉
@Mock
private RuleRepository ruleRepository;
@Mock
private RulePackageRepository rulePackageRepository;
@Before
public void setUp() {
// 初始化Mock
MockitoAnnotations.initMocks(this);
// given...willReturn 指定方法参数,模拟返回值
given(ruleRepository.findById(any())).willReturn(new RuleDO());
given(rulePackageRepository.findByIdAndTenantId(any(),any())).willReturn(new RulePackageDO());
}
@Test
public void test_get(){
long start = System.currentTimeMillis();
System.out.println(System.currentTimeMillis());
Long tenantId = 233444l;
String operator = "jx";
Long ruleId = 1701l;
RpcResult<RuleDO> ruleDORpcResult = rpcRuleService.get(tenantId, operator, ruleId);
System.out.println(ruleDORpcResult);
Assert.assertNotNull(ruleDORpcResult.getData());
long end = System.currentTimeMillis();
System.out.println((end - start));
}
}
经过测试,一个get方法的测试时间为3~4ms,而之前的springboottest中测试时间约为250ms左右。(还不包括启动配置环境的时间)