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

}
Contents