Mock脱离数据库+不使用@SpringBootTest

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左右。(还不包括启动配置环境的时间)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值