IntelliJ Idea:JUnit Test Class模板,具体取决于条件

Sas*_*ota 1 java junit templates unit-testing intellij-idea

我经常写不同类型的测试.根据测试类型,它可能有不同的设置.

例如,我的所有服务测试在类声明下都有以下注释:

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = NONE)
Run Code Online (Sandbox Code Playgroud)

所有控制器测试都有这些注释:

@RunWith(SpringRunner.class)
@WithMockUser
@WebMvcTest(controllers = MyController.class)
Run Code Online (Sandbox Code Playgroud)

另一个测试有不同的设置等.

每当我创建测试时,我都必须从另一个测试中复制粘贴此部分.

我正在寻找一种能够帮助我在IntelliJ Idea中自动完成此过程的解决方案.

问:有没有办法JUnit Test Class根据测试类型定义不同的模板?

假设类名以"Service"结尾 - 其生成的测试应使用一个模板,如果类名以"Controller"结尾 - 其测试应使用另一个,等等.

还可以通过包名称或类内容等一些其他条件来检测测试类型.

Rob*_*ijn 6

可以在"设置">"文件和代码模板">"代码"下找到JUnit代码生成模板.

您无法真正创建单独的代码模板,但您可以做的是向现有模板添加逻辑.他们使用基于Velocity的指令.因此,例如,如果我们采用现有的JUnit 4模板:

import static org.junit.Assert.*;
#parse("File Header.java")

public class ${NAME} {
  ${BODY}
}
Run Code Online (Sandbox Code Playgroud)

我们可以将其修改为以下内容:

import static org.junit.Assert.*;
#if($CLASS_NAME.contains("Service"))
//Import whatever you need for services here.
#end
#if($CLASS_NAME.contains("Controller"))
//Import whatever you need for controllers here.
#end
#parse("File Header.java")
#if($CLASS_NAME.contains("Controller"))
#set($CLASS_SUFFIX = ".class" )
@RunWith(SpringRunner.class)
@RunWithMock
@WebMvcTest(controllers = $CLASS_NAME$CLASS_SUFFIX)
#end
#if($CLASS_NAME.contains("Service"))
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = NONE)
#end
public class ${NAME} {
  ${BODY}
}
Run Code Online (Sandbox Code Playgroud)

这样,如果您通过上下文菜单生成一个新的JUnit 4测试类(在要测试的类的类名上按alt-enter并生成新测试),如果要测试的类的名称包含,则它将生成不同的输出'控制器'或'服务'.您可能希望将其更改为endswith而不是contains,具体取决于您使用的任何命名约定.在这两种情况下我都遗漏了实际的导入语句,但我相信你能够添加它们.