重要性:★☆☆☆☆
如果测试类中的一个方法被注解为@TestTemplate
,那么这个方法就是个测试模板方法。
测试模板方法本身不是测试方法,而是测试方法的模板,用于生成测试方法。测试模板方法必须与一个注册了的TestTemplateInvocationContextProvider
扩展共同使用。测试模板方法被设计为在测试期间可以多次调用,其次数由注册的TestTemplateInvocationContextProvider
返回的调用上下文的数量决定。测试模板方法的每次调用被视同为执行了一个注解为@Test
的普通测试方法,完全支持相同的生命周期回调和扩展。
TestTemplateInvocationContextProvider
负责提供一个TestTemplateInvocationContext
实例的流。每个TestTemplateInvocationContext
实例生成一个测试,它可以指定一个显示名以及用于执行下一轮调用的一系列额外的扩展。
下面的代码创建一个TestTemplateInvocationContextProvider
实现类:
package yang.yu.tdd.template;
import org.junit.jupiter.api.extension.*;
import java.util.Collections;
import java.util.List;
import java.util.stream.Stream;
public class MyTestTemplateInvocationContextProvider
implements TestTemplateInvocationContextProvider {
@Override
public boolean supportsTestTemplate(ExtensionContext context) {
return true;
}
@Override
public Stream<TestTemplateInvocationContext> provideTestTemplateInvocationContexts(
ExtensionContext context) {
return Stream.of(invocationContext("apple"), invocationContext("banana"));
}
private TestTemplateInvocationContext invocationContext(String parameter) {
return new TestTemplateInvocationContext() {
@Override
public String getDisplayName(int invocationIndex) {
return parameter;
}
@Override
public List<Extension> getAdditionalExtensions() {
return Collections.singletonList(new ParameterResolver() {
@Override
public boolean supportsParameter(ParameterContext parameterContext,
ExtensionContext extensionContext) {
return parameterContext.getParameter().getType().equals(String.class);
}
@Override
public Object resolveParameter(ParameterContext parameterContext,
ExtensionContext extensionContext) {
return parameter;
}
});
}
};
}
}
下面的代码将这个TestTemplateInvocationContextProvider
扩展注册到测试模板方法testTemplate()
:
… …
点击阅读本节完整内容↓↓↓
原创 | TDD工具集:JUnit、AssertJ和Mockito (二十一)编写测试-测试模板