和Java|让 JUnit4 测试类自动注入 logger 被测 Service

本文介绍如何通过自定义 IDEA 的 JUnit4 Test Class 模板,实现生成测试类时自动注入 logger 和被测 Service。

背景

在 IntelliJ IDEA 中,通过快捷键可以快速生成 JUnit4 测试类,但是生成测试类以后,总是需要手动添加 logger 和被测 Service 的注入。虽然这是一个很小的「重复动作」,但程序员还是不能忍(其实已经忍了很多年了)。

需求

以给如下简单的 Service 生成测试类为例:

 

kotlin

代码解读

复制代码

package com.test.data.user.service; import com.test.common.base.BaseService; import com.test.data.user.entity.UserSource; /** * @author mazhuang */ public interface UserSourceService extends BaseService<UserSource> { /** * 记录用户来源 * @param userId - * @param threadId - */ void recordUserSource(Long userId, Long threadId); }

command + n 调出 Generate 菜单,然后选择 Test,配置测试类的名称、基类和包:

idea-generate-junit4-test-class.png

默认生成的测试类如下:

 

scala

代码解读

复制代码

package com.test.data.user.service; import static org.junit.Assert.*; import com.test.BaseTests; import org.junit.Test; /** * @author mazhuang */ public class UserSourceServiceTest extends BaseTests { @Test public void recordUserSource() { } }

然而在写测试用例的过程中,总是需要用到 logger 和 Service,所以期望中的测试类默认长这样:

 

scala

代码解读

复制代码

package com.test.data.user.service; import static org.junit.Assert.*; import com.test.BaseTests; import org.junit.Test; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; /** * @author mazhuang */ @Slf4j public class UserSourceServiceTest extends BaseTests { @Autowired private UserSourceService userSourceService; @Test public void recordUserSource() { } }

方案与实现

经过一番 search,发现 IDEA 的 Preference - Editor - File and Code Templates 的 Code 里有一个 JUnit4 Test Class,可以自定义生成 JUnit4 测试类的模板。

这个模板原始内容是这样的:

 

arduino

代码解读

复制代码

import static org.junit.Assert.*; #parse("File Header.java") public class ${NAME} { ${BODY} }

基于我们的需求,将其修改为以下内容即可:

 

kotlin

代码解读

复制代码

#set( $LastDotIndex = $CLASS_NAME.lastIndexOf(".") + 1 ) #set( $CamelCaseName = "$CLASS_NAME.substring($LastDotIndex)" ) #set( $CamelCaseName = "$CamelCaseName.substring(0, 1).toLowerCase()$CamelCaseName.substring(1)") import static org.junit.Assert.*; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; #parse("File Header.java") @Slf4j public class ${NAME} { @Autowired private ${CLASS_NAME} ${CamelCaseName}; ${BODY} }

其中,${CLASS_NAME} 是被测试类的全限定名,${CamelCaseName} 是根据 ${CLASS_NAME} 生成的被测试类的驼峰命名。

至此,经过一点微小的努力,我们实现了一个小小的自动化,工作效率又提高了一点点,程序员又开心了一点点。

小结

察觉到重复动作,并消除——也许可以称之为「偷懒」,这是程序员的日常小乐趣,也是 人类进步的动力 吧。

文中完整脚本已上传至 GitHub,仓库地址:github.com/mzlogin/cod… ,以后如果有更新,或者新的代码生成脚本,也会放在这个仓库里。


注:本文封面图片由 Stable Diffusion 生成,模型:SDXL-Lightning 4-Step,提示词:Java, programmer, black and white, computer, simple background。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值