Saya melakukan tes integrasi di musim semi dan dalam contoh ini saya menguji lapisan layanan.

Saya punya masalah di mana selama tes penambahan di layanan, rollback tidak berfungsi, dan selalu menambahkan item ke pangkalan, tetapi tidak menghapusnya.

Saya meletakkan anotasi @ Transactional dan @ TestPropertySource pada kelas pengujian, juga memiliki application-test.properties dan pengujian berhasil tetapi rollback tidak dijalankan dan item baru selalu ditambahkan ke database pengujian.

Kelas pengujian dan metode pengujian saya untuk menambahkan alamat (yang terakhir):

@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 saya :

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

Dan ketika menjalankan tes add address, setiap kali di basis data kts_test saya (db digunakan untuk pengujian) ditambahkan item baru dan bukan rollback.

Ini adalah log dari konsol di mana Anda dapat melihat bahwa rollback dipanggil tetapi tidak dieksekusi, karena ketika saya me-refresh database setelah pengujian, item baru ditinggalkan, itu tidak dihapus.

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],...

Terakhir, untuk menulis bahwa saya mencoba @Transactional metode di atas, saya juga mencoba @ Rollback metode di atas atau @ Rollback (benar), mencoba mengubah application-test.properties dan saya tidak lagi tahu apa kesalahannya.

Jika ada yang bisa membantu saya akan berterima kasih. Terima kasih.

2
jovanKg 7 Maret 2020, 20:19

1 menjawab

Jawaban Terbaik

Hibernate secara default membuat tabel dengan mesin penyimpanan MyISAM - mesin ini tidak mendukung transaksi. Anda harus memiliki tabel InnoDB:

  • Kelola migrasi DB Anda secara manual dengan alat seperti Flyway (opsi yang lebih disukai sehingga Anda dapat memiliki kontrol penuh) dan matikan pembuatan ulang basis data dalam pengujian.
  • Atau atur mesin yang benar dalam konfigurasi:
spring.jpa.properties.hibernate.dialect.storage_engine=innodb

ATAU (tidak digunakan lagi)

spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
2
Josef Cech 7 Maret 2020, 19:50