views:

373

answers:

3

I have a JUnit 4 test suite with BeforeClass and AfterClass methods that make a setup/teardown for the following test classes. What I need is to run the test classes also by them selves, but for that I need a setup/teardown scenario (BeforeClass and AfterClass or something like that) for each test class. The thing is that when I run the suite I do not want to execute the setup/teardown before and after each test class, I only want to execute the setup/teardown from the test suite (once). Is it possible ? Thanks in advance.

+3  A: 

I don't know of any standard way to do this with JUnit. The reason for it, as you probably already know, is that your test cases should run independently of each other. This concerns the "normal" setup/teardown methods which run before and after each test method. Class setup and teardown is a bit different though - although I would still prefer running my tests independently and staying out of the trouble zone.

However, if you really are convinced of what you are doing, you could use a global flag to signal whether or not the class setup/teardown is to run, and to check for its state in the class setup/teardown methods. In your test suite, you could include a special class as the very first one, which does nothing more than execute the setup and set the global flag to indicate to the real test cases that their class setup/teardown methods must not be run. Similarly, a special last class in the suite can execute the teardown code. The caveat is that I am afraid JUnit does not guarantee the order of execution of test classes inside a suite, although most probably it does execute them in the specified order - but this is just an implementation detail. Try it out, it may work for you - but there is no guarantee it will always do what you expect.

Péter Török
Thanks for the answer, i actually thought of that but i thought maybe there was a better solution. The reason for What i want to do is because the setup cleans the environment and resets the database so it takes some time and that is why i don't want to run the setup for each test class, but i need to when i run an individual test.
Hypnus
+2  A: 

If you have jUnit 4.7+ I recommend looking into the new feature called Rules (which are explained in this blog post). They might not be exactly what you want, but they are probably the best you get with jUnit.

Supposedly TestNG has better test grouping possibilities, but I haven't really looked into it myself yet.

ponzao
A: 

No, there's no standard way to do this in JUnit, though you could hack something up as Péter Török suggested.

Note however that you are more or less abusing JUnit in doing this. The whole point of unit tests it that they are independent of each other. This is because dependencies between tests create a total maintenance nightmare (tests failing because the run in the wrong order).

So I'd advise you to strongly consider if it's not better to just always run the setup...

sleske
Thanks, id did consider that but the setup has a much longer duration than the hole test with all the test classes :)
Hypnus
I feel your pain :-(. If actually had to do this as well, for tests with complicated setup (though it was only per class). Some kind of "I'm already initialized" flag is probably your best bet.
sleske