For more information about JUnit 5, I suggest reading the JUnit 5 User Guide.
In JUnit 5, if you want to execute a method before each test, then you can use the @BeforeEach
annotation. To get information about the test to be executed you can give the method a TestInfo
parameter which will be automatically injected for you. For example:
import java.lang.reflect.Method;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestInfo;
// import logger...
class XXXTests {
final Logger logger = ...;
@BeforeEach
void logStartOfTest(TestInfo info) {
logger.info("STARTING test: " + info.getMethod().map(Method::getName).orElse(null));
}
@Test
void testFoo() {
// perform assertions
}
}
If you don't want to have to write that for every test, then you can create your own extension that implements BeforeEachCallback
. For example:
import java.lang.reflect.Method;
import org.junit.jupiter.api.extension.BeforeEachCallback;
import org.junit.jupiter.api.extension.ExtensionContext;
// import logger..
public class MyExtension implements BeforeEachCallback {
final Logger logger = ...;
@Override
public void beforeEach(ExtensionContext context) {
logger.info("STARTING test: " + context.getTestMethod().map(Method::getName).orElse(null));
}
}
Then apply your extension:
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
@ExtendWith(MyExtension.class)
class XXXTests {
@Test
void testFoo() {
// perform assertions
}
}
Your extension class can implement multiple extension interfaces. If you want to watch for success and failure, then you can also implement org.junit.jupiter.api.extension.TestWatcher
, but note that interface only became stable API in JUnit 5.7 (I believe it was added in version 5.4).