Spring Инъекция зависимостей с помощью TestNG

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

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

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

Ответ 2

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

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!
    }
}

Ответ 3

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

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

  • BeforeSuite
  • BeforeTest
  • BeforeClass
  • BeforeMethod

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

В классе 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!
    }
}