Does Junit reinitialize the class with each test method invocation?
Answer for JUnit 5
In JUnit5, this behavior is controlled using the @TestInstance
annotation. The annotation can take as value one of two lifecycle qualifiers:
@TestInstance(Lifecycle.PER_CLASS)
: The test class will be initialized once for all the methods in the class.@TestInstance(Lifecycle.PER_METHOD)
: The test class will be reinitialized before each test method (the behavior described in other answers).
If a test class is not annotated with @TestInstance
, the default behavior is PER_METHOD
.
For more details, see Test Instance Lifecycle in the JUnit5 User Guide.
It is because of test isolation.
No test should depend on another.
Look at the documentation of org.junit.runner.Runner
:
The default runner implementation guarantees that the instances of the test case class will be constructed immediately before running the test and that the runner will retain no reference to the test case instances, generally making them available for garbage collection.
Unit tests should be independant otherwise it becomes unmaintable. Note that the order of executed methods is not guaranteed (unless you use the annotation @FixMethodOrder
).
New Instance of MyTest
for each test method
For each test method a new instance of MyTest
will be created this is the behavior of Junit.
So in your case for both methods the variable count
will have value 1
, and thus the value of count++
will be 2
for both the test methods and hence the test cases pass.
public class MyTest{
public MyTest(){
// called n times
System.out.println("Constructor called for MyTest");
}
@Before //called n times
public void setUp(){
System.out.println("Before called for MyTest");
}
//n test methods
}
If you execute the code above with 2 test methods:
Output will be:
Constructor called for MyTest
Before called for MyTest
//test execution
Constructor called for MyTest
Before called for MyTest
Edit:
Isolation from the F.I.R.S.T principle of testing
Test frameworks help you in doing the right thing, a very important property of unit tests is isolation.
By creating a new instance every test method, the dirty SUT is thrown away. So that we have a fresh state for every test.
Read about F.I.R.S.T principle of testing.