Contents
在之前版本的Junit,测试构造器和方法不被允许有参数(至少标准的Runner实现没有),Junit Jupiter主要的改变,测试构造器和方法都允许有参数。这样扩展性更强,可以依赖注入构造器和方法。
ParameterResolver定义了API,期望在测试用例执行时,运行期动态解决参数。如果一个测试类构造器,测试方法或生命周期方法,接受一个参数,参数必须运行期注册为ParameterResolver。
有几个内建解析器会自动注册。
TestInfoParameterResolver,如果一个构造器或方法参数类型是TestInfo。TestInfoParameterResolver会供给TestInfo实例,相当于当前容器或测试值当作参数。TestInfo用于从当前容器或测试检索信息,例如显示姓名,测试类,测试方法,有关联的标签等。显示的姓名是一个科技方法,例如测试类的名字或方法,或通过@DisplayName自定义的。
TestInfo是替换junit4的TestName规则。下面例子的目的是测试构造器注入testInfo,@BeforeEach和测试方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue;
import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.TestInfo;
@DisplayName("TestInfo Demo") class TestInfoDemo {
TestInfoDemo(TestInfo testInfo) { assertEquals("TestInfo Demo", testInfo.getDisplayName()); }
@BeforeEach void init(TestInfo testInfo) { String displayName = testInfo.getDisplayName(); assertTrue(displayName.equals("TEST 1") || displayName.equals("test2()")); }
@Test @DisplayName("TEST 1") @Tag("my-tag") void test1(TestInfo testInfo) { assertEquals("TEST 1", testInfo.getDisplayName()); assertTrue(testInfo.getTags().contains("my-tag")); }
@Test void test2() { }
}
|
RepetitionInfoParameterResolver
如果一个方法参数在@RepeatedTest,@BeforeEach,@AfterEach是RepetitionInfo类型,RepetitionInfoParameterResolver将会接受一个RepetitionInfo实例。RepetitionInfo可以用来检索信息,包括当前重复信息和总的循环次数从@RepeatedTest。注意,RepetitionInfoParameterResolver在@RepeatedTest上下文外不会被注册。
TestReporterParameterResolver
如果一个构造器或方法参数的类型是TestReporter,TestReporterParameterResolver将会接受一个TestReporter实例。TestReporter可以发布当前测试运行的额外信息。在TestExecutionListener的reportingEntryPublished()来消耗数据,允许IDEs或报告查看。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| class TestReporterDemo {
@Test void reportSingleValue(TestReporter testReporter) { testReporter.publishEntry("a status message"); }
@Test void reportKeyValuePair(TestReporter testReporter) { testReporter.publishEntry("a key", "a value"); }
@Test void reportMultipleKeyValuePairs(TestReporter testReporter) { Map<String, String> values = new HashMap<>(); values.put("user name", "dk38"); values.put("award year", "1974");
testReporter.publishEntry(values); }
}
|