@TestTemplate 是模板骨架,需配合@ExtendWith和TestTemplateInvocationContextProvider使用;必须标记非private/static方法、实现提供器接口、注册扩展;参数由上下文提供或内置对象自动注入。

@TestTemplate 不是直接运行的测试方法,而是一个“模板骨架”——它定义逻辑结构,由扩展机制按需生成并执行多个具体测试实例。要真正用起来,必须配合 @ExtendWith 和自定义的 TestTemplateInvocationContextProvider 实现。
核心三要素缺一不可
一个可工作的 @TestTemplate 测试,需要同时满足以下三点:
- 用 @TestTemplate 标记一个返回 void、非 private / static 的方法
- 实现 TestTemplateInvocationContextProvider 接口,提供上下文流(即每次执行时传入的参数或配置)
- 通过 @ExtendWith 注册该 provider,让 JUnit5 知道“谁来决定怎么展开这个模板”
写一个最简可用的模板示例
比如想对同一段校验逻辑,用不同输入反复验证:
@TestTemplate
@ExtendWith(SimpleProvider.class)
class StringValidationTemplate {
@Test
void testLength(String input) {
assertNotNull(input);
assertTrue(input.length() > 0);
}
}
这里 testLength 方法本身不运行,但只要 SimpleProvider 提供了多个 String 上下文,JUnit 就会为每个 String 生成一个独立测试项。
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
实现上下文提供器的关键点
TestTemplateInvocationContextProvider 的两个核心方法必须正确实现:
- supportsTestTemplate(ExtensionContext):返回 true 表示当前测试类/方法支持该模板扩展(通常直接返回 true 即可)
- provideTestTemplateInvocationContexts(ExtensionContext):返回 Stream<TestTemplateInvocationContext>,每个 context 包含一组参数(如 String、int、自定义对象),还会指定显示名(用于报告中区分)
例如,返回两个字符串上下文:
public class SimpleProvider implements TestTemplateInvocationContextProvider {
@Override
public boolean supportsTestTemplate(ExtensionContext context) {
return true;
}
@Override
public Stream<TestTemplateInvocationContext> provideTestTemplateInvocationContexts(ExtensionContext context) {
return Stream.of(
TestTemplateInvocationContext.of("empty string", Collections.singletonList("")),
TestTemplateInvocationContext.of("hello world", Collections.singletonList("hello world"))
);
}
}
参数类型和注入支持
@TestTemplate 方法签名里的参数,会被自动注入:
- 基本类型(String、int 等)由 provider 提供的上下文匹配传入
- JUnit 内置对象如 TestInfo、TestReporter 可直接作为参数,无需 provider 提供
- 不支持任意自定义类型自动注入;如需复杂对象,应在 provider 中构造好并放入 context,再通过参数类型接收
注意:不能混用 @ParameterizedTest 的 csv / methodSource 等方式,@TestTemplate 是另一套独立机制。

















