原创 | TDD 工具集:JUnit、AssertJ 和 Mockito (十九) 编写测试 - 依赖注入\测试接口\重复测试
本文分享在编写测试中“依赖注入、测试接口、重复测试”三节内容的方法。
依赖注入
重要性:★★☆☆☆
JUnit Jupiter允许测试类的构造函数、测试方法和生命周期方法接受参数。这些参数在运行时通过预先注册的参数解析器ParameterResolver
的实例进行解析。
1. 内建的参数解析器
有3个内建的参数解析器,在JUnit中它们是自动注册的:
TestInfoParameterResolver
如果测试类的构造函数、测试方法或生命周期方法的参数类型是TestInfo
,内建的参数解析器TestInfoParameterResolver
将提供一个TestInfo
的实例作为这些方法的参数值。可以使用这个TestInfo
实例来检索当前测试容器或测试方法的相关信息,例如显示名称、测试类、测试方法以及相关的标签等。
下面的代码显示如何获取注入构造函数、生命周期函数和测试方法的TestInfo
的内容:
RepetitionInfoParameterResolver
如果测试类的构造函数、测试方法或生命周期方法拥有注解@RepeatedTest
、@BeforeEach
、@AfterEach
,并且接受类型为RepetitionInfo
的参数,参数解析器RepetitionInfoParameterResolver
将提供一个RepetitionInfo
实例作为这些方法的参数值。可以从RepetitionInfo
中获取当前重复次数以及总重复次数等相关信息。
下面是示例代码:
TestReporterParameterResolver
如果测试类的构造函数、测试方法或生命周期方法的参数类型是TestReporter
,参数解析器TestReporterParameterResolver
将提供一个TestReporter
实例作为这些方法的参数值。可以使用这个TestReporter
向当前测试的测试报告添加额外的数据。这些数据可以被TestExecutionListener
的reportingEntryPublished()
方法消费,使它们可以显示在IDE视图和测试报告中。
下面是示例代码:
2. 自定义参数解析器
可以通过创建自定义的参数解析器并通过@ExtendWith
注解注册到被测试类,来让测试类构造函数、测试方法、生命周期方法注入特定类型的参数。
下面创建一个自定义的参数解析器RandomParametersExtension
,这个参数解析器在测试方法中查找拥有@Random
注解的int型参数,提供一个随机整数值:
下面的代码显示通过注册RandomParametersExtension
参数解析器,给测试方法注入随机整数:
测试接口
重要性:★★★☆☆
从Java 8开始,可以在接口上定义默认方法和静态方法,包含实现代码。
JUnit Jupiter允许在接口的默认方法上声明@Test
, @RepeatedTest
, @ParameterizedTest
, @TestFactory
, @TestTemplate
, @BeforeEach
, 和@AfterEach
注解,在接口的静态方法上声明 @BeforeAll
和 @AfterAll
注解。如果采用PER_CLASS
生命周期的话,也可以在接口的默认方法上声明 @BeforeAll
和 @AfterAll
注解。实现这些接口的测试方法将继承这些方法和注解。
注解@Tag
和@ExtendWith
也可以声明在接口上,由实现这些接口的测试类继承。
下面的代码创建一个TestLifecycleLogger
接口,定义了生命周期相关方法。
下面的代码创建TestInterfaceDynamicTestsDemo
接口,定义了注解为@TestFactory
的动态测试生成方法dynamicTestsForPalindromes()
:
下面的代码创建测试类TestInterfaceDemo
,它继承了上面的几个接口:
当测试类TestInterfaceDemo
执行时,它所实现的各个接口上定义的测试方法、生命周期方法、测试工厂方法也会执行,就如同这些方法是直接定义在测试类上面一样。
重复测试
重要性:★★☆☆☆
通过声明@RepeatedTest
注解取代@Test`注解,JUnit可以让一个测试方法重复执行若干次。
上面的测试方法repeatedTest()
会重复执行10次。
还可以通过RepeatedTest
注解的name
属性给测试方法定制显示名:
方法的最终显示名可以是通过@DisplayName
注解定义的静态显示名和通过@RepeatedTest
注解的name
属性定义的动态显示名的组合。
在通过@RepeatedTest
注解的name
属性定义的动态显示名,可以获取下面的静态内容:
{displayName}
:方法上的注解@RepeatedTest
的值。{currentRepetition}
:当前是第几次执行。{totalRepetitions}
:总重复次数。
这一节就讲到这里,下一节我们讲讲"参数化测试"。
版权声明: 本文为 InfoQ 作者【编程道与术】的原创文章。
原文链接:【http://xie.infoq.cn/article/13278514419bb818f0694e29f】。文章转载请联系作者。
评论