IntelliJ Idea:JUnit测试类模板,具体取决于条件

时间:2017-11-09 12:39:35

标签: java unit-testing templates intellij-idea junit

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

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

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = NONE)

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

@RunWith(SpringRunner.class)
@WithMockUser
@WebMvcTest(controllers = MyController.class)

另一项测试有不同的设置等。

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

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

问:有没有办法定义JUnit Test Class模板,这些模板的工作方式会有所不同,具体取决于测试的类型?

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

还可以按包名称或类内容等其他条件检测测试类型。

1 个答案:

答案 0 :(得分:6)

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

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

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

public class ${NAME} {
  ${BODY}
}

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

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}
}

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