Code-Apprentice
Code-Apprentice

Reputation: 83577

Using multiple TestRules in the same test

I have written a custom TestRule to use with my Android test suite. It populates a table in the database used by the app under test. Now I need to use this DataRule along with ActivityTestRule. Can I have two fields of my test class annotated with @Rule? How do I control the order in which the rules are applied?

Background:

The Android API provides a TestRule for starting an Activity which is the core class for every app with a UI. My app has a database and I have several tests which require the database to be pre-populated with some known data. Previously, with JUnit3-based tests, I used an abstract superclass to centralize the code which prepares the database and then I extended this superclass for different test cases. Now I am trying to implement the same logic using JUnit 4. I learned recently that test rules are one way to provide logic which is reused across tests, so I am trying to move the logic from my superclass to a test rule. Is this an appropriate way to achieve my goal?

Upvotes: 6

Views: 6949

Answers (3)

Bisma Frühling
Bisma Frühling

Reputation: 774

RuleChain is deprecated and since 4.13 you can make use of order parameter in Rule.

org.junit.Rule annotation has a parameter "order" which you can use to order the Rules in one file.

check the doc in the link below

Rule.java

Upvotes: 5

sisyphus
sisyphus

Reputation: 6392

You certainly can have multiple @Rule fields in a single test. I'm not sure what the default ordering of rule application is, or if it's even well-defined. However, if ordering is important you can control it with a RuleChain which allows you to define an order on how rules are applied when you have multiple rules in a test case.

From the Javadoc...

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

Upvotes: 11

Jefferson Tavares
Jefferson Tavares

Reputation: 991

If you're using JUnit for your tests, which I personally recommend, it's not recommended to have multiple rules in the same file, because a Rule is a unit of your test, and as you're doing unit tests, you should have just one Rule per file.

If you need to create some sort of data before you run your tests you should use the @Before and then load the necessary information. More on this can be found here: http://junit.sourceforge.net/javadoc/org/junit/Before.html

If you have to load the same data in multiple classes, I would recommend you to create a class with your logic, extend that class in your test class and then create a method annotated with @Before an call your super class method.

Hope that helps

Upvotes: 0

Related Questions