Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Spring-Autowiring happens after @BeforeClass when running test with maven-surefire

Tags:

I have some problems with dependency injection (Spring autowiring) and maven-surefire. The following test works without problems when run in eclipse with TestNG: The service-object is injected, then the @BeforeClass-method is called.

@TransactionConfiguration(defaultRollback=false) @ContextConfiguration(locations={"/testContext.xml"}) public class MyServiceTest extends AbstractTransactionalTestNGSpringContextTests {   @Autowired private MyService service;  @BeforeTest public void setup() {     System.out.println("*********************"+service);     Assert.assertNotNull(service); } 

However, when I run the very same testcase with maven-surefire, first setup() is called, which causes the test to fail:

[INFO] --- maven-surefire-plugin:2.7.2:test (default-test) @ myserver --- [INFO] Surefire report directory: D:\... -------------------------------------------------------  T E S T S ------------------------------------------------------- Running TestSuite **************************null 2011-03-04 11:08:57,462 DEBUG  ionTestExecutionListener.prepareTestInstance  - Performing dependency injection for test context [[TestContext@1fd6bea... 2011-03-04 11:08:57,462 DEBUG  ractGenericContextLoader.loadContext          - Loading ApplicationContext for locations [classpath:/testContext.xml]. 

How can I solve this problem? If I replace @BeforeClass with @Test it works in maven as in TestNG's eclipse plugin.

maven-surefire-plugin:2.7.2

Eclipse: Helios Service Release 1

jdk1.6.0_14

TestNG: 5.14.10

like image 990
thofoer Avatar asked Mar 04 '11 10:03

thofoer


2 Answers

Additionally, until this issue is fixed, if things still aren't working for you after following the previous advice OR you do not wish your code to be executed before every single method, then add the following code to your test class:

@Override @BeforeSuite protected void springTestContextPrepareTestInstance() throws Exception {     super.springTestContextPrepareTestInstance(); } 

This ensures that the Spring Context will be prepared before your @BeforeClass methods are executed.

*note, I posted this answer since in the title you're asking about @BeforeClass, even though there is no usage of @BeforeClass in your sample code.

like image 58
Aidan O Avatar answered Sep 23 '22 02:09

Aidan O


Use @BeforeMethod, not @BeforeTest.

like image 34
Cedric Beust Avatar answered Sep 22 '22 02:09

Cedric Beust