H2 DB пуст при тестированииJAVA

Программисты JAVA общаются здесь
Anonymous
H2 DB пуст при тестировании

Сообщение Anonymous »

Я хочу запустить тесты в моем приложении, используя H2 в качестве базы данных, но каждый раз, когда я пытаюсь запустить тест, это показывает мне исключение, говоря, что H2 DB пусто. Ни один из связанных вопросов, которые я прочитал, не помог мне./// I know is pointless to test this, but I am learning to implement tests
public interface ConocimientoRepository extends JpaRepository{
@Modifying
@Transactional
@Query(value = "DELETE FROM conocimiento WHERE busca_id = :buscaId", nativeQuery = true)
void deleteAllConocimientoFromBuscaId(@Param("buscaId") Long buscaId);
}
< /code>
Сам тест: < /p>
@DataJpaTest
@AutoConfigureTestDatabase(connection = EmbeddedDatabaseConnection.H2)
@ActiveProfiles("test")
public class ConocimientoRepositoryTests {

@Autowired
BuscaRepository buscaRepository;

@Autowired
ConocimientoRepository conocimientoRepository;

private Busca b1, b2;
private List listConocimientos;

@BeforeEach
public void initData() {

b1 = new Busca("Ana", "ana@mail.com", "Sevilla", "612345678", "Password1!");
b2 = new Busca("Luis", "luis@mail.com", "Madrid", "712345678", "SecurePwd2@");

listConocimientos = List.of(
Conocimiento.builder()
.centroEducativo("Centro 1")
.titulo("Título 1")
.inicioPeriodoConocimiento(LocalDate.of(2020, 1, 1))
.finPeriodoConocimiento(LocalDate.of(2021, 1, 1))
.busca(b1)
.build(),
Conocimiento.builder()
.centroEducativo("Centro 2")
.titulo("Título 2")
.inicioPeriodoConocimiento(LocalDate.of(2019, 1, 1))
.finPeriodoConocimiento(LocalDate.of(2020, 1, 1))
.busca(b1)
.build(),
Conocimiento.builder()
.centroEducativo("Centro 3")
.titulo("Título 3")
.inicioPeriodoConocimiento(LocalDate.of(2018, 1, 1))
.finPeriodoConocimiento(LocalDate.of(2019, 1, 1))
.busca(b2)
.build()
);

b1.setListaConocimientos(listConocimientos.subList(0, 1));
b2.setListaConocimientos(List.of(listConocimientos.get(2)));

buscaRepository.saveAll(List.of(b1,b2));
}

@Test
public void ConocimientoRepository_DeleteAllConocimientoFromBuscaId_RemoveAllConocimientoFromBuscaId() {
buscaRepository.delete(b1);

Assertions.assertThat(listConocimientos.stream().allMatch(con -> con.getBusca().getId() != b1.getId()));
}
}
< /code>
объекты, затронутые тестом: < /p>
@EqualsAndHashCode(of = "id")
@Data
@ToString(exclude = "busca")
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Entity
public class Conocimiento {
@GeneratedValue(strategy = GenerationType.AUTO)
@Id
private Long id;

@NotNull
@Size(max = 40, message = "Máximo 40 carácteres")
private String centroEducativo;

@NotNull
@Size(max = 40, message = "Máximo 40 carácteres")
private String titulo;

@NotNull
private LocalDate inicioPeriodoConocimiento;

@NotNull
private LocalDate finPeriodoConocimiento;

@ManyToOne
@JoinColumn(name = "busca_id")
@JsonBackReference(value = "busca-conocimiento")
private Busca busca;

public Conocimiento(@NotNull @Size(max = 40, message = "Máximo 40 carácteres") String centroEducativo,
@NotNull @Size(max = 40, message = "Máximo 40 carácteres") String titulo, LocalDate fechaInicio, LocalDate fechaFin) {
this.centroEducativo = centroEducativo;
this.titulo = titulo;
this.inicioPeriodoConocimiento = fechaInicio;
this.finPeriodoConocimiento = fechaFin;
}

}
< /code>
@Data
@ToString(exclude = {"listaOfertas"})
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(of = "id")
@Builder
@Entity
@Table(name = "Busca")
public class Busca extends Usuario {

@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, mappedBy = "busca")
private List listaExperiencias;

@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, mappedBy = "busca")
private List listaConocimientos;

@JsonBackReference("busca-oferta")
@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinTable(name = "busca_oferta", joinColumns = @JoinColumn(name = "busca_id"), inverseJoinColumns = @JoinColumn(name = "oferta_id"))
@JsonIgnoreProperties("busca_id")
private List listaOfertas;

public Busca(String nombre, String email, String ciudad, String telefono, String password) {
super(nombre, email, ciudad, telefono, password, Rol.BUSCA);
}
}
< /code>
Это содержимое приложения test.properties:
spring.h2.console.enabled=true
spring.sql.init.platform=h2
spring.jpa.defer-datasource-initialization=true

spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
spring.jpa.hibernate.ddl-auto=create-drop
< /code>
и, наконец, ошибка стека из теста: < /p>
org.springframework.dao.InvalidDataAccessResourceUsageException: could not prepare statement [Table "BUSCA" not found (this database is empty); SQL statement:
insert into busca (ciudad,email,nombre,password,rol,telefono) values (?,?,?,?,?,?) [42104-214]] [insert into busca (ciudad,email,nombre,password,rol,telefono) values (?,?,?,?,?,?)]; SQL [insert into busca (ciudad,email,nombre,password,rol,telefono) values (?,?,?,?,?,?)]
at org.springframework.orm.jpa.vendor.HibernateJpaDialect.convertHibernateAccessException(HibernateJpaDialect.java:277)
at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:241)
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:550)
at org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:61)
at org.springframework.dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:335)
at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:152)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184)
at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:164)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:220)
at jdk.proxy2/jdk.proxy2.$Proxy142.saveAll(Unknown Source)
at com.example.demo.repositories.ConocimientoRepositoryTests.initData(ConocimientoRepositoryTests.java:67)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
< /code>
Что это может быть? PrettyPrint-Override ">jdbc:h2:mem:test;DB_CLOSE_DELAY=-1
< /code>
, что я уже сделал: < /p>
spring.h2.console.enabled=true
spring.sql.init.platform=h2
spring.jpa.defer-datasource-initialization=true

spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
spring.jpa.hibernate.ddl-auto=create-drop


Подробнее здесь: https://stackoverflow.com/questions/796 ... on-testing

Вернуться в «JAVA»