В соответствии с этими ссылками: https://stackoverflow.com/a/20056622/1623597https://stackoverflow.com/a/15640575/1623597 TestNG не создает новый экземпляр для каждого теста метода.force TestNG для создания нового экземпляра для каждого метода test
У меня есть приложение для загрузки весны. Мне нужно написать интеграционные тесты (Controller, service, Repositories). Иногда для создания нового тестового примера мне нужны некоторые сущности в БД. Чтобы забыть о каких-либо предопределенных сущностях в db, я решил издеваться над слоем репозитория. Я только что внедрил ApplicationContextInitializer, который находит все репозитории JPA в classpath и добавляет свои mocks к весеннему контексту.
У меня возникла новая проблема в том, что мои mocks создаются один раз за один ControllerTest (который расширяет AbstractTestNGSpringContextTests). Протестированный контекст создается только один раз, а макеты экземпляров одинаковы для всех методов. Теперь у меня есть
//All repos are mocked via implementation of ApplicationContextInitializer<GenericWebApplicationContext>
// and added to spring context by
//applicationContext.getBeanFactory().registerSingleton(beanName, mock(beanClass)); //beanClass in our case is StudentRepository.class
@Autowired
StudentRepository studentRepository;
//real MyService implementation with autowired studentRepository mock
@Autowired
MyService mySevice;
@Test
public void test1() throws Exception {
mySevice.execute(); //it internally calls studentRepository.findOne(..); only one time
verify(studentRepository).findOne(notNull(String.class));
}
//I want that studentRepository that autowired to mySevice was recreated(reset)
@Test
public void test2() throws Exception {
mySevice.execute(); //it internally calls studentRepository.findOne(..); only one time
verify(studentRepository, times(2)).findOne(notNull(String.class)); //I don't want to use times(2)
//times(2) because studentRepository has already been invoked in test1() method
}
@Test
public void test3() throws Exception {
mySevice.execute(); //it internally calls studentRepository.findOne(..); only one time
verify(studentRepository, times(3)).findOne(notNull(String.class)); //I don't want to use times(3)
}
мне нужно увеличить время (N) на каждую последующую method.I понимает, что это TestNG реализация, но я пытаюсь найти хорошее решение для меня. Для моих служб я использую autowiring конструктора, и все поля являются окончательными.
Вопросы:
Можно ли заставить TestNG создать новый экземпляр для каждого теста метод? Могу ли я воссоздать весенний контекст для каждого теста метода?
Могу ли я создать свой собственный прокси для каждого издевавшегося репозитория и сбросить mocks в методе @BeforeMethod через мой прокси?
Вы уже пытаются восстановить то, что вы хотите в @ Before/AfterMethod? – juherr
Я не могу использовать этот подход. Причина в том, что у меня может быть 10 репозиториев, которые используются в других 20 сервисах. каждая из этих служб использует автоустановку конструктора и имеет конечные поля. Кроме того, я не могу передать все службы и заменить mocks в @ Before/AfterMethod – Geniy
Как вы инициализируете 'myService'? – juherr