2016-05-16 7 views
0

В соответствии с этими ссылками: 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 конструктора, и все поля являются окончательными.

Вопросы:

  1. Можно ли заставить TestNG создать новый экземпляр для каждого теста метод? Могу ли я воссоздать весенний контекст для каждого теста метода?

  2. Могу ли я создать свой собственный прокси для каждого издевавшегося репозитория и сбросить mocks в методе @BeforeMethod через мой прокси?

+0

Вы уже пытаются восстановить то, что вы хотите в @ Before/AfterMethod? – juherr

+0

Я не могу использовать этот подход. Причина в том, что у меня может быть 10 репозиториев, которые используются в других 20 сервисах. каждая из этих служб использует автоустановку конструктора и имеет конечные поля. Кроме того, я не могу передать все службы и заменить mocks в @ Before/AfterMethod – Geniy

+0

Как вы инициализируете 'myService'? – juherr

ответ

0

На самом деле мне не нужно было создавать новые экземпляры макета хранилища в контексте, мне просто нужно было сбросить их состояние. Я думал, что Mockito.reset (mock) просто создаст новый экземпляр и назначит его до настоящего момента. Но это неправда. Реальное поведение Mockito.reset - просто чистое текущее состояние для макета без создания нового экземпляра mock.

Мое решение:

import org.springframework.data.repository.Repository; 

@Autowired 
private List<Repository> mockedRepositories; 

@BeforeMethod 
public void before() { 
    mockedRepositories.forEach(Mockito::reset); 
} 

Этот код autowire все операции РЕПО, которые были издевались в ApplicationContextInitializer, и сбросить их состояние. Теперь я могу использовать проверить() без раз (2)

@Test 
public void test2() throws Exception { 
    mySevice.execute() 
    verify(studentRepository).findOne(notNull(String.class)); 
} 
Смежные вопросы