JUnit - before method
-
07-07-2021 - |
Pregunta
I need to execute some piece of code before every JUnit test method. To execute this piece of code I use SpringTest class AbstractTestExecutionListener and its child TransactionContextTestExecutionListener.
This is code:
public class TransactionContextTestExecutionListener extends AbstractTestExecutionListener{
private static final Logger logger = Logger.getLogger(TransactionContextTestExecutionListener.class);
@Override
public void beforeTestMethod(TestContext testContext) throws Exception {
Object ctx = testContext.getApplicationContext().getBean(Context.class);
}
My JUnit class looks like:
@ContextConfiguration(locations = "classpath:/META-INF/spring-test/tests-context.xml")
@RunWith(SpringJUnit4ClassRunner.class)
@TestExecutionListeners(TransactionContextTestExecutionListener.class)
@Transactional
public class SelectQueryBuilderTest {}
Problem is that beforeTestMethod method is only called before first executed test method. It is not called before all of the rest ones.
Is problem in configuration? Any idea?
Thanks
Solución
I would suggest trying @Before. For example, consider creating a base class for your test:
@ContextConfiguration(locations = "classpath:/META-INF/spring-test/tests-context.xml")
@RunWith(SpringJUnit4ClassRunner.class)
@TestExecutionListeners(TransactionContextTestExecutionListener.class)
@Transactional
public class BaseQueryBuilderTest {
@Autowired
private ApplicationContext applicationContext;
protected Context context;
@Before
public void setUp() {
context = applicationContext.getBean(Context.class);
}
}
And now you can write your test implementation as follows:
public class SelectQueryBuilderTest extends BaseQueryBuilderTest {
@Test
public void test() {
// Use context
}
}
One of the benefits of this approach is that it encapsulates a lot of metadata in the base class, sparing you from having to duplicate it in all of your actual test classes.
Otros consejos
As you are running your JUnit class with the SpringJUnit4ClassRunner
, you can use the JUnit 4 annotations:
@Before
public void multipleInit() {
// Called before each method annotated with @Test
...
}
@BeforeClass
public static void initAll() {
// Called once per class, before any method annotated with @Test is called
...
}