Пружинная инъекция зависимостей с TestNG - PullRequest
54 голосов
/ 09 апреля 2010

Spring поддерживает JUnit довольно хорошо по этому поводу: С аннотациями RunWith и ContextConfiguration все выглядит очень интуитивно

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:dao-context.xml")

Этот тест сможет правильно работать как в Eclipse, так и в Maven. Интересно, есть ли подобные вещи для TestNG. Я подумываю перейти на этот фреймворк «следующего поколения», но я не нашел подходящего для тестирования с Spring.

Ответы [ 3 ]

56 голосов
/ 09 апреля 2010

Работает и с TestNG. Ваш тестовый класс должен продлить один из следующих классов:

25 голосов
/ 02 апреля 2012

Вот пример, который работал для меня:

import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.testng.AbstractTestNGSpringContextTests;
import org.testng.annotations.Test;

@Test
@ContextConfiguration(locations = {"classpath:applicationContext.xml"})
public class TestValidation extends AbstractTestNGSpringContextTests {

    public void testNullParamValidation() {
        // Testing code goes here!
    }
}
18 голосов
/ 10 мая 2013

Spring и TestNG хорошо работают вместе, но есть некоторые вещи, о которых нужно знать. Помимо создания подклассов AbstractTestNGSpringContextTests, вы должны знать, как он взаимодействует со стандартными аннотациями установки / разрыва TestNG.

TestNG имеет четыре уровня настройки

  • BeforeSuite
  • BeforeTest
  • BeforeClass
  • BeforeMethod

, которые происходят именно так, как вы ожидаете (отличный пример самодокументируемых API). Все они имеют необязательное значение, называемое «depenno_nMethods», которое может принимать String или String [], которые являются именами или именами методов одного уровня.

Класс AbstractTestNGSpringContextTests имеет аннотированный метод BeforeClass с именем springTestContextPrepareTestInstance, от которого необходимо установить метод установки, если в нем используется класс с автопроводкой. Что касается методов, вам не нужно беспокоиться об автопроводке, поскольку это происходит, когда тестовый класс настроен в этом до метода класса.

Это просто оставляет вопрос о том, как вы можете использовать класс с автопроводкой в ​​методе, аннотированном с помощью BeforeSuite. Вы можете сделать это, вручную вызвав springTestContextPrepareTestInstance - хотя он по умолчанию не настроен для этого, я несколько раз делал это успешно.

Итак, чтобы проиллюстрировать, модифицированная версия примера Arup:

import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.testng.AbstractTestNGSpringContextTests;
import org.testng.annotations.Test;

@Test
@ContextConfiguration(locations = {"classpath:applicationContext.xml"})
public class TestValidation extends AbstractTestNGSpringContextTests {

    @Autowired
    private IAutowiredService autowiredService;

    @BeforeClass(dependsOnMethods={"springTestContextPrepareTestInstance"})
    public void setupParamValidation(){
        // Test class setup code with autowired classes goes here
    }

    @Test
    public void testNullParamValidation() {
        // Testing code goes here!
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...