JUnit ExpectedException Rule vs. Catch-Exception
During one of my conference talks I got an interesting question: "why do you prefer to test exceptions using catch-exception library instead of using ExpectedException Rule of JUnit?". This is a good question, so let me answer.
Introduction
First of all, let us see both solutions.
You can read about ExpectedException
rule at https://github.com/junit-team/junit/wiki/Exception-testing.
To learn about catch-exception
go to http://code.google.com/p/catch-exception/.
Ok, so now we can answer the question.
You can learn more about testing from my book "Practical Unit Testing"
And by the way - the JUnit version is coming soon! :)
Not Only JUnit
The first reason is that some of the projects I work with use JUnit and some TestNG. Both frameworks offer different mechanisms for testing of the expected exception. Catch-exception lets me use the same idiom no matter which framework I use, which is very convenient.
BDD
What I like about catch-exception is that it does not break the arrange/act/assert or given/when/then flow of my tests.
This is unfortunately not possible with the ExpectedException rule, because you have to specify first what is expected, so the assertion part happens before the actual execution.
Stop the Test
In case of the ExpectedException rule the test stops after an exception is thrown. In some (rare) scenarios this is not welcomed, because sometimes you would like to verify some other stuff before claiming that the test passed.
In case of catch-exception the test goes on, and you can have additional assertions afterwards.
Conclusion
- It is better to use @Test(expected = ...) than to not test exceptions at all.
- It is better to use ExpectedException rule than @Test(expected = ...)
- It is better to use catch-exception than ExpectedException rule.
Keep on testing! :)
- Tomek Kaczanowski's blog
- Login to post comments
This used to be my blog. I moved to http://tomek.kaczanowscy.pl long time ago.
Constructor testing
I agree with conclusion, but ExpectedException rule is the best choise when you are testing constructors.
thanks, forgot about this one!
oh, thank you - I forgot about constructor testing