From 10fe4a99cb05f8afe1d2b0198b1c5fd023d8196d Mon Sep 17 00:00:00 2001 From: opitzju <julian.opitz@stud.hs-hannover.de> Date: Wed, 1 Dec 2021 17:56:48 +0100 Subject: [PATCH] =?UTF-8?q?H2=20in-memory=20db=20f=C3=BCr=20unit=20tests?= =?UTF-8?q?=20hinzugef=C3=BCgt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 7 +++++ .../edu/hsh/dbs2/imdb/logic/GenreManager.java | 4 +-- .../java/edu/hsh/dbs2/imdb/logic/Manager.java | 14 ++++++---- .../edu/hsh/dbs2/imdb/logic/MovieManager.java | 6 ++--- .../hsh/dbs2/imdb/logic/PersonManager.java | 4 +-- src/test/java/edu/hsh/dbs2/imdb/TestDB.java | 3 +-- src/test/resources/META-INF/persistence.xml | 26 +++++++++++++++++++ 7 files changed, 50 insertions(+), 14 deletions(-) create mode 100644 src/test/resources/META-INF/persistence.xml diff --git a/pom.xml b/pom.xml index 0a08385..5e5c18f 100644 --- a/pom.xml +++ b/pom.xml @@ -23,6 +23,12 @@ <version>4.13.2</version> <scope>test</scope> </dependency> + <dependency> + <groupId>com.h2database</groupId> + <artifactId>h2</artifactId> + <version>1.4.200</version> + <scope>test</scope> + </dependency> <dependency> <groupId>com.oracle.database.jdbc</groupId> <artifactId>ojdbc8</artifactId> @@ -37,6 +43,7 @@ <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.22</version> + <scope>compile</scope> </dependency> </dependencies> diff --git a/src/main/java/edu/hsh/dbs2/imdb/logic/GenreManager.java b/src/main/java/edu/hsh/dbs2/imdb/logic/GenreManager.java index 4408f48..1191fb2 100644 --- a/src/main/java/edu/hsh/dbs2/imdb/logic/GenreManager.java +++ b/src/main/java/edu/hsh/dbs2/imdb/logic/GenreManager.java @@ -7,7 +7,7 @@ import java.util.Collection; import java.util.List; import java.util.stream.Collectors; -public class GenreManager extends Manager { +public class GenreManager extends Manager<Genre> { GenreManager(EntityManagerFactory sessionFactory) { super(sessionFactory); @@ -19,7 +19,7 @@ public class GenreManager extends Manager { } Collection<Genre> getGenreImpl() { - return query(Genre.class, (cb, cq) -> cq.select(cq.from(Genre.class))); + return query((cb, cq) -> cq.select(cq.from(Genre.class))); } } diff --git a/src/main/java/edu/hsh/dbs2/imdb/logic/Manager.java b/src/main/java/edu/hsh/dbs2/imdb/logic/Manager.java index ceefb40..87d91ef 100644 --- a/src/main/java/edu/hsh/dbs2/imdb/logic/Manager.java +++ b/src/main/java/edu/hsh/dbs2/imdb/logic/Manager.java @@ -6,27 +6,31 @@ import jakarta.persistence.RollbackException; import jakarta.persistence.criteria.CriteriaBuilder; import jakarta.persistence.criteria.CriteriaQuery; +import java.lang.reflect.ParameterizedType; import java.util.List; import java.util.function.BiConsumer; import java.util.function.Consumer; -public class Manager { +public class Manager<T> { private final ThreadLocal<EntityManager> localManager; + private final Class<T> type; + @SuppressWarnings("unchecked") protected Manager(EntityManagerFactory sessionFactory) { this.localManager = ThreadLocal.withInitial(sessionFactory::createEntityManager); + this.type = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0]; } - protected <T> List<T> queryNoClose(Class<T> type, BiConsumer<CriteriaBuilder, CriteriaQuery<T>> function) { + protected List<T> queryNoClose(BiConsumer<CriteriaBuilder, CriteriaQuery<T>> function) { var manager = getEntityManager(); var cb = manager.getCriteriaBuilder(); var cq = cb.createQuery(type); function.accept(cb, cq); return manager.createQuery(cq).getResultList(); } - protected <T> List<T> query(Class<T> type, BiConsumer<CriteriaBuilder, CriteriaQuery<T>> function) { - var result = queryNoClose(type, function); + protected List<T> query(BiConsumer<CriteriaBuilder, CriteriaQuery<T>> function) { + var result = queryNoClose(function); closeEntityManager(); return result; } @@ -55,7 +59,7 @@ public class Manager { } } - protected <T> T mergeIfDetached(T entity) { + protected <E> E mergeIfDetached(E entity) { var manager = getEntityManager(); if (!manager.contains(entity)) return manager.merge(entity); diff --git a/src/main/java/edu/hsh/dbs2/imdb/logic/MovieManager.java b/src/main/java/edu/hsh/dbs2/imdb/logic/MovieManager.java index 6cff03c..6015352 100644 --- a/src/main/java/edu/hsh/dbs2/imdb/logic/MovieManager.java +++ b/src/main/java/edu/hsh/dbs2/imdb/logic/MovieManager.java @@ -10,7 +10,7 @@ import java.util.List; import java.util.Optional; import java.util.stream.Collectors; -public class MovieManager extends Manager { +public class MovieManager extends Manager<Movie> { private final GenreManager genreManager; private final PersonManager personManager; private final MovieMapper mapper = new MovieMapper(); @@ -22,7 +22,7 @@ public class MovieManager extends Manager { } public List<MovieDTO> getMovieList(final String search) { - var movies = query(Movie.class, (cb, cq) -> { + var movies = query((cb, cq) -> { var root = cq.from(Movie.class); cq.select(root); if (search != null && search.length() > 0) @@ -73,7 +73,7 @@ public class MovieManager extends Manager { } private Optional<Movie> findMovieById(final long id) { - return queryNoClose(Movie.class, (cb, cq) -> { + return queryNoClose((cb, cq) -> { var root = cq.from(Movie.class); cq.select(root).where(cb.equal(root.get("id"), id)); }).stream().findAny(); diff --git a/src/main/java/edu/hsh/dbs2/imdb/logic/PersonManager.java b/src/main/java/edu/hsh/dbs2/imdb/logic/PersonManager.java index c4eda31..bdb59ef 100644 --- a/src/main/java/edu/hsh/dbs2/imdb/logic/PersonManager.java +++ b/src/main/java/edu/hsh/dbs2/imdb/logic/PersonManager.java @@ -7,7 +7,7 @@ import java.util.Collection; import java.util.List; import java.util.stream.Collectors; -public class PersonManager extends Manager { +public class PersonManager extends Manager<Person> { PersonManager(EntityManagerFactory sessionFactory) { super(sessionFactory); @@ -19,7 +19,7 @@ public class PersonManager extends Manager { } Collection<Person> getPeopleImpl(final String text) { - return query(Person.class, (cb, cq) -> { + return query((cb, cq) -> { var root = cq.from(Person.class); cq.select(root); if (text != null && text.length() > 0) diff --git a/src/test/java/edu/hsh/dbs2/imdb/TestDB.java b/src/test/java/edu/hsh/dbs2/imdb/TestDB.java index a297315..b96fa61 100644 --- a/src/test/java/edu/hsh/dbs2/imdb/TestDB.java +++ b/src/test/java/edu/hsh/dbs2/imdb/TestDB.java @@ -7,7 +7,6 @@ import edu.hsh.dbs2.imdb.logic.ManagerFactory; import edu.hsh.dbs2.imdb.logic.MovieManager; import edu.hsh.dbs2.imdb.logic.dto.CharacterDTO; import edu.hsh.dbs2.imdb.logic.dto.MovieDTO; -import edu.hsh.dbs2.imdb.util.Util; import jakarta.persistence.EntityManagerFactory; import jakarta.persistence.Persistence; import jakarta.persistence.PersistenceException; @@ -24,7 +23,7 @@ public class TestDB { @BeforeClass public static void setUp() { - sessionFactory = Persistence.createEntityManagerFactory("edu.hsh.dbs2.imdb", Util.getTestDataProperty()); + sessionFactory = Persistence.createEntityManagerFactory("edu.hsh.dbs2.imdb"); ManagerFactory.instance.setSessionFactory(sessionFactory); movieManager = ManagerFactory.instance.getMovieManager(); } diff --git a/src/test/resources/META-INF/persistence.xml b/src/test/resources/META-INF/persistence.xml new file mode 100644 index 0000000..fedb5f8 --- /dev/null +++ b/src/test/resources/META-INF/persistence.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8" standalone="yes"?> +<persistence xmlns="https://jakarta.ee/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="3.0" + xsi:schemaLocation="https://jakarta.ee/xml/ns/persistence https://jakarta.ee/xml/ns/persistence/persistence_3_0.xsd"> + <persistence-unit name="edu.hsh.dbs2.imdb" transaction-type="RESOURCE_LOCAL"> + <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider> + <class>edu.hsh.dbs2.imdb.entity.Movie</class> + <class>edu.hsh.dbs2.imdb.entity.Genre</class> + <class>edu.hsh.dbs2.imdb.entity.Person</class> + <class>edu.hsh.dbs2.imdb.entity.MovieCharacter</class> + <properties> + <property name="jakarta.persistence.jdbc.driver" value="org.h2.Driver"/> + <property name="jakarta.persistence.jdbc.url" value="jdbc:h2:mem:myDb;DB_CLOSE_DELAY=-1"/> + <property name="jakarta.persistence.jdbc.user" value="sa"/> + <property name="jakarta.persistence.jdbc.password" value=""/> + <property name="jakarta.persistence.schema-generation.database.action" value="create" /> + <property name="jakarta.persistence.schema-generation.create-source" value="script"/> + <property name="jakarta.persistence.schema-generation.create-script-source" value="src/main/resources/Schema.sql"/> + <property name="jakarta.persistence.sql-load-script-source" value="src/main/resources/TestData.sql"/> + <property name="hibernate.check_nullability" value="true"/> + <property name="hibernate.hbm2ddl.auto" value="validate"/> + <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/> + <property name="hibernate.show_sql" value="true"/> + <property name="hibernate.format_sql" value="true"/> + </properties> + </persistence-unit> +</persistence> \ No newline at end of file -- GitLab