Spring-Autowiring происходит после @BeforeClass при запуске теста с maven-surefire - PullRequest
20 голосов
/ 04 марта 2011

У меня есть некоторые проблемы с внедрением зависимостей (Spring autowiring) и maven-surefire. Следующий тест работает без проблем при запуске в Eclipse с TestNG: Сервисный объект внедряется, затем вызывается @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 [[TestContext@1fd6bea...
2011-03-04 11:08:57,462 DEBUG  ractGenericContextLoader.loadContext          - Loading ApplicationContext for locations [classpath:/testContext.xml].

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

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

Eclipse: Helios Service Release 1

jdk1.6.0_14

TestNG: 5.14.10

Ответы [ 5 ]

20 голосов
/ 08 мая 2011

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

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

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

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

12 голосов
/ 04 марта 2011

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

7 голосов
/ 09 марта 2011

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

  • Сэм (автор Spring TestContext Framework;))
1 голос
/ 04 марта 2014

Используйте @PostConstruct, а не @ BeforeXXX

0 голосов
/ 22 апреля 2015

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

...