我已经编写了一个用于我的Android测试套件的自定义TestRule
。它填充了受测试应用程序使用的数据库中的表。现在我需要使用此DataRule
和ActivityTestRule
。我可以使用@Rule
注释我的测试类的两个字段吗?如何控制规则的应用顺序?
背景
Android API提供了一个TestRule,用于启动一个Activity,它是每个具有UI的应用程序的核心类。我的应用程序有一个数据库,我有几个测试,要求数据库预先填充一些已知的数据。以前,使用基于JUnit3的测试,我使用抽象超类来集中准备数据库的代码,然后我为不同的测试用例扩展了这个超类。现在我尝试使用JUnit 4实现相同的逻辑。我最近了解到测试规则是提供跨测试重用的逻辑的一种方式,所以我试图将逻辑从我的超类移到测试规则。这是实现我的目标的适当方式吗?
答案 0 :(得分:7)
您在一次测试中肯定可以拥有多个@Rule
字段。我不确定规则应用程序的默认顺序是什么,或者它是否定义得很好。但是,如果订购很重要,您可以使用RuleChain
进行控制
这允许您定义在测试用例中有多个规则时如何应用规则的顺序。
来自Javadoc ......
@Rule
public RuleChain chain = RuleChain
.outerRule(new LoggingRule("outer rule")
.around(new LoggingRule("middle rule")
.around(new LoggingRule("inner rule");
答案 1 :(得分:1)
如果您正在使用JUnit进行测试(我个人推荐),建议不要在同一个文件中使用多个规则,因为规则是测试的一个单元,当您进行单元测试时,每个文件应该只有一个规则。
如果在运行测试之前需要创建某种数据,则应使用@Before然后加载必要的信息。 有关详细信息,请访问:http://junit.sourceforge.net/javadoc/org/junit/Before.html
如果你必须在多个类中加载相同的数据,我建议你用你的逻辑创建一个类,在你的测试类中扩展该类,然后用@Before调用你的超类方法创建一个注释的方法。
希望有所帮助
答案 2 :(得分:1)
不推荐使用RuleChain,从4.13版本开始,您可以在Rule中使用order参数。
org.junit.Rule批注具有一个参数“ order”,可用于在一个文件中对规则进行排序。
在下面的链接中检查文档