重要性:★☆☆☆☆
如果测试类中的一个方法被注解为@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 (二十一)编写测试-测试模板
评论