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

¿Fue útil?

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
    ...
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top