Junit creates a new instance of Test class before calling each test method (This is the standard default life cycle mode PER_METHOD). This is the default behaviour is junit Jupiter 5.
TestInstanceLifeCycleDemo1.java
package com.sample.app;
import org.junit.jupiter.api.Test;
public class TestInstanceLifeCycleDemo1 {
@Test
public void test1() {
System.out.println("this: " + this);
}
@Test
public void test2() {
System.out.println("this: " + this);
}
@Test
public void test3() {
System.out.println("this: " + this);
}
}
When you ran above test class, you will see below messages in console.
this: com.sample.app.TestInstanceLifeCycleDemo1@3d99d22e this: com.sample.app.TestInstanceLifeCycleDemo1@131276c2 this: com.sample.app.TestInstanceLifeCycleDemo1@26aa12dd
As you observe the output, three different instances created (One instance for one test method).
How can I customize this behaviour, so that only one instance is used across all the test methods?
Annotate your test class with @TestInstance(Lifecycle.PER_CLASS)
Example
@TestInstance(Lifecycle.PER_CLASS)
public class TestInstanceLifeCycleDemo2 {
.....
.....
}
TestInstanceLifeCycleDemo2.java
package com.sample.app;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestInstance;
import org.junit.jupiter.api.TestInstance.Lifecycle;
@TestInstance(Lifecycle.PER_CLASS)
public class TestInstanceLifeCycleDemo2 {
@Test
public void test1() {
System.out.println("this: " + this);
}
@Test
public void test2() {
System.out.println("this: " + this);
}
@Test
public void test3() {
System.out.println("this: " + this);
}
}
Run above class, you will see below messages in console.
this: com.sample.app.TestInstanceLifeCycleDemo2@3a883ce7 this: com.sample.app.TestInstanceLifeCycleDemo2@3a883ce7 this: com.sample.app.TestInstanceLifeCycleDemo2@3a883ce7
As you observe the console output, you can observe same instance is used in all the test methods.
How can I apply ‘Lifecycle.PER_CLASS’ to all my test classes?
You can achieve this in either of following approaches.
Approach 1: Set the property 'junit.jupiter.testinstance.lifecycle.default' to 'per_class' in src/test/resources/junit-platform.properties file.
junit.jupiter.testinstance.lifecycle.default = per_class
Approach 2: Start JVM with following system property.
-Djunit.jupiter.testinstance.lifecycle.default=per_class
No comments:
Post a Comment