在同一测试中使用多个 TestRules

Using multiple TestRules in the same test

我编写了一个自定义 TestRule 用于我的 Android 测试套件。它在被测应用程序使用的数据库中填充 table。现在我需要将此 DataRuleActivityTestRule 一起使用。我可以用 @Rule 注释我的测试 class 的两个字段吗?如何控制应用规则的顺序?

背景:

Android API 提供了用于启动 Activity 的测试规则,这是每个具有 UI 的应用程序的核心 class。我的应用程序有一个数据库,我有几个测试需要数据库预先填充一些已知数据。以前,对于基于 JUnit3 的测试,我使用抽象的 superclass 来集中准备数据库的代码,然后我将这个 superclass 扩展到不同的测试用例。现在我正在尝试使用 JUnit 4 实现相同的逻辑。我最近了解到测试规则是提供跨测试重用逻辑的一种方式,所以我试图将逻辑从我的 superclass 移动到测试规则。这是实现我的目标的合适方法吗?

如果您使用 JUnit 进行测试(我个人推荐),则不建议在同一个文件中包含多个规则,因为规则是测试的一个单元,并且在进行单元测试时,每个文件应该只有一个规则。

如果您需要在 运行 测试之前创建某种数据,您应该使用 @Before 然后加载必要的信息。 可以在这里找到更多相关信息:http://junit.sourceforge.net/javadoc/org/junit/Before.html

如果你必须在多个 class 中加载相同的数据,我建议你用你的逻辑创建一个 class,在你的测试中扩展 class class 然后创建一个用 @Before 注释的方法调用你的超级 class 方法。

希望对您有所帮助

您当然可以在单个测试中有多个 @Rule 字段。我不确定规则应用程序的默认顺序是什么,或者它是否定义明确。但是,如果排序很重要,您可以使用 RuleChain 来控制它 当您在测试用例中有多个规则时,它允许您定义如何应用规则的顺序。

来自 Javadoc...

@Rule
public RuleChain chain = RuleChain
                           .outerRule(new LoggingRule("outer rule")
                           .around(new LoggingRule("middle rule")
                           .around(new LoggingRule("inner rule");

RuleChain 已弃用,自 4.13 起您可以在 Rule 中使用顺序参数。

org.junit.Rule 注释有一个参数 "order",您可以使用它在一个文件中对规则进行排序。

查看下面 link 中的文档

Rule.java