Jak wstrzyknąć EntityManager do klasy testowej w javie?

0

Cześć. Mam taki problem, że nie wiem jak wstrzyknąć entity managera do mojej klasy testowej. Chodzi o to, że ani @PersistenceContext ani @PersistenceUnit ani zwykłe manualne utworzenie entity manager nie działa i leci mi exception, że entity manager is null. Poniżej konfiguracja springowa, klasa testowa i exception.

@Configuration
public class JpaConfig {

@Bean
public LocalContainerEntityManagerFactoryBean createEMF(JpaVendorAdapter adapter){
    LocalContainerEntityManagerFactoryBean emf = new LocalContainerEntityManagerFactoryBean();

    Map<String, String> properties = new HashMap<>();
    properties.put("javax.persistence.jdbc.url", "jdbc:mysql://localhost:3306/shop?createDatabaseIfNotExist=true&allowPublicKeyRetrieval=true&useSSL=false&serverTimezone=UTC");
    properties.put("javax.persistence.jdbc.user", "root");
    properties.put("javax.persistence.jdbc.password", "ErykSkoczylas1");
    properties.put("javax.persistence.jdbc.driver", "com.mysql.cj.jdbc.Driver");
    properties.put("javax.persistence.schema-generation.database.action", "drop-and-create");
    emf.setPersistenceUnitName("shop-database");
    emf.setJpaPropertyMap(properties);
    emf.setJpaVendorAdapter(adapter);
    emf.setPackagesToScan("com.database.models");
    return emf;
}

@Bean
public JpaVendorAdapter createVendorAdapter() {
    HibernateJpaVendorAdapter adapter = new HibernateJpaVendorAdapter();
    adapter.setDatabase(Database.MYSQL);
    adapter.setShowSql(true);
    return adapter;
}

@Bean
public TransactionManager transactionManager(EntityManagerFactory entityManagerFactory) {
    JpaTransactionManager jpaTransactionManager = new JpaTransactionManager();
    jpaTransactionManager.setEntityManagerFactory(entityManagerFactory);
    return jpaTransactionManager;
}

}

KLASA TESTOWA:
public class CustomerServiceTest {
private AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(SpringJpaApplication.class);
private CustomerService customerService = ctx.getBean(CustomerService.class);

@PersistenceUnit
private EntityManagerFactory entityManagerFactory;
private EntityManager entityManager;

EXCEPTION:

java.lang.NullPointerException: Cannot invoke "javax.persistence.EntityManager.createQuery(String, java.lang.Class)" because "this.entityManager" is null

0

Daj nad klasa, @DataJpaTest.
I wstrzyknij TestEntityManager.

W klasach testowych propo persystnacji jest inne podejście.

Zobacz tez poradnik: https://zetcode.com/springboot/testentitymanager/

2

To czego szukasz, to w jaki sposób pisać testy integracyjne z użyciem Springa.

Musisz w testach wystartować kontekst Springa. Wówczas będziesz mógł do klasy testowej wstrzykiwać beany jak w kodzie produkcyjnym. Możesz to zrobić za pomocą adnotacji: https://www.baeldung.com/integration-testing-in-spring
Nie ma potrzeby dobierania się do komponentów przez statici, tym bardziej, że w ogóle nie podnosisz kontekstu Springa, więc tam nic nie ma :)

Inna kwestia, dlaczego chcesz wstrzykiwać „gołego” EntityManagera, a nie jakieś swoje repozytorium/DAO. Nie zawsze jest to zle, zależy w jakim celu to robisz.

0

javax.persistence.TransactionRequiredException: No EntityManager with actual transaction available for current thread

Daj nad base klasą testową albo nad klasą testową @Transactional w ciemno xd może zadziała

1 użytkowników online, w tym zalogowanych: 0, gości: 1