views:

312

answers:

3

I have a test suite class:

@RunWith(Suite.class)
@Suite.SuiteClasses({
    GameMasterTest.class,
    PlayerTest.class,
})
public class BananaTestSuite { 

What annotation do I need to use to make a function in this class run before any of the classes containing actual tests? Right now, I'm doing this, and it works, but it's not as readable as it could be:

static {
 try {
  submitPeelAction = new Player(new GameMaster(1)).getClass().getDeclaredMethod("submitPeelAction");
 } catch (SecurityException e) {
  e.printStackTrace();
 } catch (NoSuchMethodException e) {
  e.printStackTrace();
 }
 submitPeelAction.setAccessible(true);
}

I tried @BeforeClass but it didn't work.

A: 

Use @Before for setUp() and @After for tearDown methods.

EDIT: after some tests here I found that @Before and @After does not work for Test Suite. In your case you should use @BeforeClass and a static method to encapsulate your initialization code.

@RunWith(Suite.class)
@SuiteClasses( { ContactTest.class })
public class AllTests {

    @BeforeClass
    public static void init() {
     System.out.println("Before all");
    }

}
nandokakimoto
A: 

Annotate a method with @BeforeClass to make it run before all tests run in that class. Annotate a method with @Before to make it run before each test in that class.

re. your comments, @BeforeClass works fine. Are you throwing an exception within that method ?

Brian Agnew
He doesn't want either of those, he wants something attached to the entire suite that runs before any of the BeforeClass methods.
bmargulies
Mmm. Perhaps you're right. I confess it doesn't seem that clear, though.
Brian Agnew
A: 

First of all: if you are up to the latest JUnit, ie 4.7 or higher, you might also get this done with Rules. For a starting point see http://www.infoq.com/news/2009/07/junit-4.7-rules.

To my understanding, a static block in the suite class is a nice solution.

The downside is that it will only be called when your run the entire suit and not separate tests or test classes. So an alternative would be to call the same static method in the suite class from an @BeforeClass methods in all you classes.

Adrian