У меня есть простой проект Spring со встроенной в память базой данных. У меня есть простой метод сохранения жизненного цикла, который просто вызывает print. Когда я запускаю приложение, оно корректно регистрируется, когда я запускаю тестирование, но это не так. Как сделать так, чтобы тестовая среда вызывала метод обратного вызова жизненного цикла? Мне нужно знать, как это сделать, потому что я собираюсь выполнить интеграционный тест с методом обратного вызова жизненного цикла.
Здесь записываются журналы, когда я запускаю ./gradlew bootRun
...
2020-04-19 22:04:14.532 INFO 24183 --- [ main] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default'
2020-04-19 22:04:14.765 INFO 24183 --- [ main] c.flama.lifecycle.LifecycleApplication : Started LifecycleApplication in 1.885 seconds (JVM running for 2.218)
INSIDE CRAZY METHOD
PRINTING ENTITIES
1
2020-04-19 22:04:14.877 INFO 24183 --- [extShutdownHook] j.LocalContainerEntityManagerFactoryBean : Closing JPA EntityManagerFactory for persistence unit 'default'
...
, а здесь логи при запуске ./gradlew test
> Task :test
2020-04-19 22:04:07.308 INFO 24076 --- [extShutdownHook] j.LocalContainerEntityManagerFactoryBean : Closing JPA EntityManagerFactory for persistence unit 'default'
2020-04-19 22:04:07.308 INFO 24076 --- [extShutdownHook] .SchemaDropperImpl$DelayedDropActionImpl : HHH000477: Starting delayed evictData of schema as part of SessionFactory shut-down'
2020-04-19 22:04:07.312 INFO 24076 --- [extShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated...
2020-04-19 22:04:07.319 INFO 24076 --- [extShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed.
BUILD SUCCESSFUL in 5s
4 actionable tasks: 2 executed, 2 up-to-date
Здесь build.gradle:
plugins {
id 'org.springframework.boot' version '2.2.6.RELEASE'
id 'io.spring.dependency-management' version '1.0.9.RELEASE'
id 'java'
}
group = 'com.flama'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
runtimeOnly 'com.h2database:h2'
testImplementation('org.springframework.boot:spring-boot-starter-test') {
exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
}
}
test {
useJUnitPlatform()
}
Это мой основной класс:
package com.flama.lifecycle;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
import com.flama.lifecycle.repository.SillyRepository;
import com.flama.lifecycle.domain.SillyEntity;
@SpringBootApplication
public class LifecycleApplication {
public static void main(String[] args) {
ApplicationContext context = (ApplicationContext)SpringApplication.run(LifecycleApplication.class, args);
SillyRepository repository = (SillyRepository) context.getBean("sillyRepository");
repository.saveAndFlush(new SillyEntity());
System.out.println("PRINTING ENTITIES");
for (SillyEntity entity: repository.findAll()){
System.out.println(entity.getId());
}
}
}
Класс домена:
package com.flama.lifecycle.domain;
import javax.persistence.*;
@Entity
@Table(name = "silly")
public class SillyEntity{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
public Long getId(){
return id;
}
@PostPersist
public void crazyMethod(){
System.out.println("INSIDE CRAZY METHOD");
}
}
Класс хранилища:
package com.flama.lifecycle.repository;
import org.springframework.stereotype.Repository;
import com.flama.lifecycle.domain.SillyEntity;
import org.springframework.data.jpa.repository.*;
@Repository
public interface SillyRepository extends JpaRepository<SillyEntity, Long>{
}
Тестовый класс:
package com.flama.lifecycle;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.beans.factory.annotation.Autowired;
import com.flama.lifecycle.domain.SillyEntity;
import com.flama.lifecycle.repository.SillyRepository;
import java.util.List;
import static org.assertj.core.api.Assertions.assertThat;
@SpringBootTest
class LifecycleApplicationTests {
@Autowired
private SillyRepository repository;
@Test
void contextLoads() {
}
@Test
void createSillyEntity(){
SillyEntity entity = new SillyEntity();
int sizeBefore = repository.findAll().size();
repository.saveAndFlush(entity);
assertThat(repository.findAll().size()).isEqualTo(sizeBefore + 1);
}
}