接上篇:https://developer.aliyun.com/article/1227535?spm=a2c6h.13148508.setting.30.148c4f0eQyO5tl
3. 模拟Lombok的log对象问题
Lombok的@Slf4j注解,广泛地应用于Java项目中。
在某些代码分支里,可能只有log记录日志的操作,为了验证这个分支逻辑被正确执行,需要在单元测试用例中对log记录日志的操作进行验证。
1) 原始方法
2) 测试用例
3) 问题现象
执行单元测试用例失败,抛出以下异常信息:
4) 原因分析
经过调式跟踪,发现ExampleService中的log对象并没有被注入。通过编译发现,Lombok的@Slf4j注解在ExampleService类中生成了一个静态常量log,而@InjectMocks注解并不支持静态常量的注入。
5) 解决方案
采用作者实现的FieldHelper.setStaticFinalField方法,可以实现对静态常量的注入模拟对象。
4. 兼容Pandora等容器问题
阿里巴巴的很多中间件,都是基于Pandora容器的,在编写单元测试用例时,可能会遇到一些坑。
1) 原始方法
2) 测试用例
3) 问题现象
执行单元测试用例失败,抛出以下异常信息:
4) 原因分析
基于Pandora容器的中间件,需要使用Pandora容器加载。在上面测试用例中,使用了PowerMock容器加载,从而导致抛出类加载异常。
5) 解决方案
首先,把PowerMockRunner替换为PandoraBootRunner。其次,为了使@Mock、@InjectMocks等Mockito注解生效,需要调用MockitoAnnotations.initMocks(this)方法进行初始化。
接下篇:https://developer.aliyun.com/article/1227533?groupCode=java