Spring @Transactional и откат не работает, тесты интеграции Spring - PullRequest
2 голосов
/ 07 марта 2020

Весной я делаю интеграционный тест, и в этом примере я тестирую сервисный уровень.

У меня проблема, когда во время дополнительного теста в сервисе откат не работает, и я всегда добавляю элемент в базу, но не удаляйте ее.

Я помещаю аннотации @ Transactional и @ TestPropertySource в тестовый класс, также у меня есть application-test.properties, и тест успешен, но откат не выполняется, и новый элемент всегда добавляется в тестовую базу данных.

Мой тестовый класс и метод тестирования для добавления адреса (последний):

@RunWith(SpringRunner.class)
@SpringBootTest(classes = TicketServiceApplication.class)
@Transactional
@TestPropertySource("classpath:application-test.properties")
public class AddressServiceIntegrationTest {


@Autowired
private AddressService addressService;

@Autowired
private AddressRepository addressRepository;

@Test
public void findAllSuccessTest(){
    List<Address> result = addressService.finfAllAddress();

    assertNotNull(result);
    assertFalse(result.isEmpty());
    assertEquals(2, result.size());
}

@Test
public void findOneAddressExistTest_thenReturnAddress(){
    Long id = AddressConst.VALID_ID_ADDRESS;
    Address a = addressService.findOneAddress(id);
    assertEquals(id, a.getId());
}

@Test(expected = EntityNotFoundException.class)
public void findOneAddressNotExistTest_thenThrowException(){
    Long id = AddressConst.NOT_VALID_ID_ADDRESS;
    Address a = addressService.findOneAddress(id);
}

@Test
public void addAddressSuccessTest(){

    int sizeBeforeAdd = addressRepository.findAll().size();

    Address address = AddressConst.newAddressToAdd();
    Address result = addressService.addAddress(address);

    int sizeAfterAdd  = addressRepository.findAll().size();

    assertNotNull(result);
    assertEquals(sizeBeforeAdd+1, sizeAfterAdd);
    assertEquals(address.getCity(), result.getCity());
    assertEquals(address.getState(), result.getState());
    assertEquals(address.getNumber(), result.getNumber());
    assertEquals(address.getLatitude(), result.getLatitude());
    assertEquals(address.getLongitude(), result.getLongitude());
    assertEquals(address.getStreet(), result.getStreet());
}
}

Мои application-test.properties:

spring.datasource.url= jdbc:mysql://localhost:3306/kts_test&useSSL=false&
useUnicode=true&characterEncoding=utf8
spring.datasource.username = root
spring.datasource.password = root
spring.jpa.show-sql = true
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

И когда выполняется добавление теста адреса, каждый раз в мою базу данных kts_test (дБ, используемая для тестирования) добавляется новый элемент, а не откат.

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

INFO 10216 --- [           main] o.s.t.c.transaction.TransactionContext   : Rolled back transaction for test: [DefaultTestContext@3e58a80e testClass = AddressServiceIntegrationTest, testInstance = com.ftn.services.address.AddressServiceIntegrationTest@4678ec43, testMethod = addAddressSuccessTest@AddressServiceIntegrationTest, testException = [null],...

Наконец, чтобы написать t Я пробовал @Transactional вышеуказанными методами, я также пробовал @ Rollback выше методов или @ Rollback (true), пытался изменить application-test.properties, и я больше не знаю, в чем может быть ошибка.

Если кто-то может помочь Буду признателен. Спасибо.

1 Ответ

2 голосов
/ 07 марта 2020

Hibernate по умолчанию создает таблицы с механизмом хранения MyISAM - этот механизм не поддерживает транзакции. У вас должны быть таблицы InnoDB:

  • Либо управляйте миграциями БД вручную с помощью такого инструмента, как Flyway (предпочтительный вариант, так что вы можете иметь полный контроль), и отключайте воссоздание базы данных в тестах.
  • Или установите правильный двигатель в конфигурации:
spring.jpa.properties.hibernate.dialect.storage_engine=innodb

ИЛИ (устарело)

spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...