2017-02-18 4 views
1

У меня есть тестовый пример с полем @Autowired. Я хотел бы иметь один метод для настройки тестового примера, так как он имеет много @Test -написанных методов, которые будут полагаться на одни и те же сгенерированные данные (для которых мне нужен класс с автоподстановкой).Как использовать @ Before/@ BeforeClass с полем @Autowired

Что хорошего для этого?

Если у меня есть @BeforeClass, тогда мне нужно сделать метод статическим, что нарушает автоустановку.

+0

Можете ли вы добавить внешнюю зависимость к другой хорошо известной структуре? –

+0

@ GrzegorzGórkiewicz: Конечно, что вы предлагаете? – carlspring

+1

Я добавил еще одно решение. –

ответ

2

первое решение

Используйте TestNG вместо этого.
@Before* аннотации ведут себя this way в TestNG.
Никакой метод, аннотированный @Before*, не должен быть статическим.

@org.testng.annotations.BeforeClass 
public void setUpOnce() { 
    //I'm not static! 
} 

второе решение

И если вы не хотите, чтобы сделать это, вы можете использовать an execution listener from Spring (AbstractTestExecutionListener).

Вы должны аннотировать тестовый класс, как это:

@TestExecutionListeners({CustomTestExecutionListener.class}) 
public class Test { 
    //Some methods with @Test annotation. 
} 

, а затем реализовать CustomTestExecutionListener с помощью этого метода:

public void beforeTestClass(TestContext testContext) throws Exception { 
    //Your before goes here. 
} 

Самодостаточный в одном файле, который будет выглядеть следующим образом:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = {"commonContext.xml" }) 
@TestExecutionListeners({SimpleTest.class}) 
public class SimpleTest extends AbstractTestExecutionListener { 

    @Override 
    public void beforeTestClass(TestContext testContext) { 
     System.out.println("In beforeTestClass."); 
    } 

    @Test 
    public void test() { 
     System.out.println("In test."); 
    } 
} 
+0

Это выглядит великолепно, но весь мой проект имеет тесты «JUnit», и я не надеялся их выбросить. – carlspring

+1

@carlspring, поэтому я добавил что-то еще от Spring к моему ответу (нет необходимости использовать TestNG, если вы выберете второе решение);) –

+0

Может ли сам тестовый класс быть слушателем? – carlspring

0

Я придумал решение по созданию отдельного инициализатора ионный метод (не setUp), аннотированный @PostConstruct. Это не очень изящное решение, но оно гарантирует, что поля с автоподзаводом/впрыска были правильно инициализированы весной перед их использованием (что было исходной проблемой при статически аннотированном методе @BeforeClass).

Смежные вопросы