Использование Mockito в одном методе тестирования приводит к сбою других методов. - PullRequest
0 голосов
/ 29 апреля 2020

Я работаю над созданием интеграционного теста для класса обслуживания, который я тестирую, и мне нужно было смоделировать дао для одного из методов тестирования. проблема в том, что когда я запускаю тесты вместе, некоторые из моих тестов терпят неудачу, но когда я запускаю их по отдельности, тесты проходят. Если я удаляю часть с мокито, все мои тесты проходят, когда я запускаю их все сразу. Любое понимание этого приветствуется

ниже мой код:

 // here is my Service class
 public class Service {

 Dao dao;

 public Dao getDao() {
    return dao;
}

public void setDao(Dao dao) {
    this.dao = dao;
}
}

//here is my integ test

@Category(IntegrationTest.class)
@RunWith(SpringRunner.class)
public class Test{

@Rule
public ExpectedException thrown = ExpectedException.none();

@Autowired
@Qualifier(Service.SERVICE_NAME)
protected Service service;

@Before
public void setUp() {
    assertNotNull(service);
}

@Test
public void testDoSomethingOne() throws Exception {
    Dao dao = Mockito(Dao.class)
    service.setDao(dao)
    boolean flag = service.doSomething();
    Assert.assertTrue(flag);
}

@Test
public void testDoSomethingTwo() throws Exception {

    Integer num = service.doSomething();
    Assert.assertNotNull(num);
}

Ответы [ 3 ]

1 голос
/ 29 апреля 2020

Метод теста testDoSomethingOne() устанавливает фиктивный дао для экземпляра службы, который он сохраняет для остальных тестов.

Аннотируйте метод testDoSomethingOne() с помощью [@DirtiesContext][1], чтобы получить контекст fre sh, связанный с последующим методом тестирования.

Тестовая аннотация, которая указывает, что ApplicationContext связан с Тест загрязнен и поэтому должен быть закрыт и удален из кеша контекста.

Используйте эту аннотацию, если тест изменил контекст - например, путем изменения состояния одноэлементного компонента, изменения состояния внедренного база данных, et c. Последующие тесты, которые запрашивают тот же контекст, получат новый контекст.

0 голосов
/ 29 апреля 2020

Если это интеграционный тест, вы не должны издеваться над своими даосами, рекомендуемый способ - использовать базу данных в памяти, такую ​​как H2. Сотрудники Spring уже предоставляют аннотацию @DataJpaTest, которая создает для вас базу данных.

You can use the @DataJpaTest annotation to test JPA applications. By default, it scans for @Entity classes and configures Spring Data JPA repositories. If an embedded database is available on the classpath, it configures one as well. Regular @Component beans are not loaded into the ApplicationContext.

https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot -fatures-testing-spring-boot-apps-testing-autoconfigured-jpa-test

0 голосов
/ 29 апреля 2020

Вы можете получить дао перед каждым тестом и назначить его обратно на обслуживание после теста примерно так:

private static Dao dao;

@Before
public void setUp() {
    if(dao == null) {
       dao = service.getDao();
    }
}

@After
public void tearDown() {
     service.setDao(dao);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...