Spring -Autowiring происходит после @BeforeClass при запуске теста с maven-surefire

У меня есть некоторые проблемы с инъекцией зависимостей (Spring autowiring) и maven-surefire. Следующий тест работает без проблем при запуске в eclipse с помощью TestNG: Объект service вводится, затем вызывается метод @BeforeClass.

@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);
}

Однако, когда я запускаю тот же самый тестовый тест с maven-surefire, вызывается первая setup(), которая вызывает сбой теста:

[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 [[[email protected]
2011-03-04 11:08:57,462 DEBUG  ractGenericContextLoader.loadContext          - Loading ApplicationContext for locations [classpath:/testContext.xml].

Как я могу решить эту проблему? Если я заменил @BeforeClass на @Test, он будет работать в maven, как в плагине TestNG eclipse.

Maven-безошибочный-плагин: 2.7.2

Eclipse: Helios Service Release 1

jdk1.6.0_14

TestNG: 5.14.10

Ответ 1

Кроме того, до тех пор, пока эта проблема не будет исправлена, если все еще не работает для вас после выполнения предыдущего совета ИЛИ вы не хотите, чтобы ваш код выполнялся раньше каждый отдельный метод, затем добавьте следующий код в тестовый класс:

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

Это гарантирует, что контекст Spring будет подготовлен до того, как будут выполнены ваши методы @BeforeClass.

* Заметьте, я опубликовал этот ответ, поскольку в заголовке вы спрашиваете о @BeforeClass, хотя в вашем примере кода не используется @BeforeClass.

Ответ 2

Используйте @BeforeMethod, а не @BeforeTest.

Ответ 3

Я согласен с Седриком: используйте @BeforeMethod вместо @BeforeTest, так как инъекция зависимостей Spring происходит в методе @BeforeClass.

  • Сэм (автор Spring TestContext Framework;))

Ответ 4

Использовать @PostConstruct not @BeforeXXX

Ответ 5

Проверьте, есть ли у вас зависимость spring -asm. Если он у вас есть, он будет конфликтовать с зависимостью spring -core. Я удалил зависимость asm, и это сработало для меня.