Как проверить мой метод обновления DAO в тесте AbstractTransactionalJUnit4SpringContextTests? - PullRequest
0 голосов
/ 25 февраля 2019

Я использую Java 8, JUnit 4.12, Spring 4 и Hibernate 5.2.12. Наконец.Я хочу протестировать метод Hibernate, где я обновляю некоторые строки.Метод выглядит следующим образом:

        final CriteriaBuilder qb = m_entityManager.getCriteriaBuilder();
        final CriteriaUpdate<FailedEvent> q = qb.createCriteriaUpdate(FailedEvent.class);
        final Root<FailedEvent> root = q.from(FailedEvent.class);
        q.where(qb.and( qb.equal(root.get(FailedEvent_.objectId), objectId) ));
        q.set(root.get(FailedEvent_.flaggedForDelete), true);
        affectedRows = m_entityManager.createQuery(q).executeUpdate();
     return affectedRows > 0;

У меня есть следующий тест JUnit для проверки этого

public class FailedEventDaoTest extends AbstractTransactionalJUnit4SpringContextTests
...

    @Test
    public final void testFlagForDeleteByObjectId()
    {
            final String eventId = "testId";
            final FailedEvent event = failedEventDao.findByEventId(eventId);
            Assert.assertFalse("A pre-condition fo this test is that an failed_event record with id \"" + eventId + "\" have a non-empty object id.", StringUtils.isEmpty(event.getObjectId()));
            Assert.assertTrue(failedEventDao.flagForDeleteByObjectId(event.getObjectId()));
            final FailedEvent foundEvent = failedEventDao.findByEventId(eventId);
            Assert.assertTrue("Failed to mark flag for deletion.", foundEvent.getFlaggedForDelete());
    }   // testFlagForDeleteByObjectId

Но мой тест завершается неудачно в последней строке,

Assert.assertTrue("Failed to mark flag for deletion.", foundEvent.getFlaggedForDelete());

Это потому, что транзакция еще не завершена, и в базе данных ничего не обновлено?Как я могу проверить, что нужные записи обновлены?

Ответы [ 2 ]

0 голосов
/ 06 марта 2019

Не стоит расширять абстрактный класс и использовать другой подход.Например

@RunWith(SpringJUnit4ClassRunner.class) 
@Transactional

в классе.

Как:

  package com.example;

import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.transaction.annotation.Transactional;

import com.example.model.Person;
import com.example.service.PersonService;

@RunWith(SpringJUnit4ClassRunner.class)
@Transactional
@ContextConfiguration("classpath:/spring-beans.xml")
public class PersonServiceIntegrationTests {
    @Autowired
    private PersonService personService;

    @Autowired
    private JdbcTemplate jdbcTemplate;


    @Test
    public void shouldCreateNewPerson() {
        Person person = new Person();
        person.setFirstName("Kenan");
        person.setLastName("Sevindik");

        long countBeforeInsert = jdbcTemplate.queryForObject("select count(*) from t_person", Long.class);
        Assert.assertEquals(2, countBeforeInsert);

        personService.create(person);

        long countAfterInsert = jdbcTemplate.queryForObject("select count(*) from t_person", Long.class);
        Assert.assertEquals(3, countAfterInsert);
    }

    @Test
    public void shouldDeleteNewPerson() {
        long countBeforeDelete = jdbcTemplate.queryForObject("select count(*) from t_person", Long.class);
        Assert.assertEquals(2, countBeforeDelete);

        personService.delete(1L);

        long countAfterDelete = jdbcTemplate.queryForObject("select count(*) from t_person", Long.class);
        Assert.assertEquals(1, countAfterDelete);
    }

    @Test
    public void shouldFindPersonsById() {
        Person person = personService.findById(1L);

        Assert.assertNotNull(person);
        Assert.assertEquals("John", person.getFirstName());
        Assert.assertEquals("Doe", person.getLastName());
    }
}

Проверить это https://examples.javacodegeeks.com/enterprise-java/spring/write-transactional-unit-tests-spring/#section_7

Или

  @RunWith(SpringJUnit4ClassRunner.class)

@ContextConfiguration(

  classes = { StudentJpaConfig.class }, 

  loader = AnnotationConfigContextLoader.class)

@Transactional

public class InMemoryDBTest {

     

    @Resource

    private StudentRepository studentRepository;

     

    @Test

    public void givenStudent_whenSave_thenGetOk() {

        Student student = new Student(1, "john");

        studentRepository.save(student);

         

        Student student2 = studentRepository.findOne(1);

        assertEquals("john", student2.getName());

    }

}

Проверить это https://www.baeldung.com/spring-jpa-test-in-memory-database

0 голосов
/ 05 марта 2019

Попробуйте аннотацию @AfterTransaction для проверки результата.

    @AfterTransaction
    public final void theRealTest()
    {
            Assert.assertTrue("Failed to mark flag for deletion.", foundEvent.getFlaggedForDelete());
    }

https://www.springbyexample.org/examples/simple-spring-transactional-junit4-test-code-example.html

, если это также не работает, попробуйте:

«Итак, вам нужно создать несколько транзакций внутри вашего тестового метода. Как вы можете видеть, вы не можете использовать AbstractTransactionalJUnit4SpringContextTests, потому что он создает одну транзакцию для всего тестового метода, и не может использовать голый AbstractJUnit4SpringContextTests, потому что он вообще не создает транзакций.

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

Вам необходимо внедрить PlatformTransactionManager в свой тест, создать из него TransactionTemplate и использовать его для разграничения ваших транзакций, как описано в11.6. Программное управление транзакциями. "

найдено здесь: Использование AbstractTransactionalJUnit4SpringContextTests с фиксацией на полпути через

...