Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to configure JPA for testing in Maven

Is there a way to set up a second persistence.xml file in a Maven project such that it is used for testing instead of the normal one that is used for deployment?

I tried putting a persistence.xml into src/test/resources/META-INF, which gets copied into target/test-classes/META-INF, but it seems target/classes/META-INF (the copy from the src/main/resources) gets preferred, despite mvn -X test listing the classpath entries in the right order:

[DEBUG] Test Classpath : [DEBUG]   /home/uqpbecke/dev/NetBeansProjects/UserManager/target/test-classes [DEBUG]   /home/uqpbecke/dev/NetBeansProjects/UserManager/target/classes [DEBUG]   /home/uqpbecke/.m2/repository/junit/junit/4.5/junit-4.5.jar ... 

I would like to be able to run tests against a simple hsqldb configuration without having to change the deployment version of the JPA configuration, ideally straight after project checkout without any need for local tweaking.

like image 648
Peter Becker Avatar asked Dec 22 '08 04:12

Peter Becker


People also ask

How do you write junit test cases for JPA repository?

You can create a @DataJpaTest and @Autowire your repository into it. For example: @RunWith(SpringRunner. class) @DataJpaTest public class MyJpaTest { @Autowired private ChartRepository chartRepository; @Test public void myTest() { ... } }

How do I test entity manager?

What you need to insert is a query mock... @Mock private Query query; ... // when createQuery is called, return the mocked query object (instead of null) when(entityManager. createQuery(any(String. class)).

What is JPA and Junit?

JPA allows you to define which objects are persisted and how they should be persisted in the Java applications. At first, JPA was introduced as an EJB 3.0 subset. Every EJB container contains a persistent layer that is defined by the JPA. Junit can be defined as the open-source framework for unit testing in Java.


1 Answers

The following will work for Maven 2.1+ (prior to that there wasn't a phase between test and package that you could bind an execution to).

You can use the maven-antrun-plugin to replace the persistence.xml with the test version for the duration of the tests, then restore the proper version before the project is packaged.

This example assumes the production version is src/main/resources/META-INF/persistence.xml and the test version is src/test/resources/META-INF/persistence.xml, so they will be copied to target/classes/META-INF and target/test-classes/META-INF respectively.

It would be more elegant to encapsulate this into a mojo, but as you're only copying a file, it seems like overkill.

<plugin>   <artifactId>maven-antrun-plugin</artifactId>   <version>1.3</version>   <executions>     <execution>       <id>copy-test-persistence</id>       <phase>process-test-resources</phase>       <configuration>         <tasks>           <!--backup the "proper" persistence.xml-->           <copy file="${project.build.outputDirectory}/META-INF/persistence.xml" tofile="${project.build.outputDirectory}/META-INF/persistence.xml.proper"/>           <!--replace the "proper" persistence.xml with the "test" version-->           <copy file="${project.build.testOutputDirectory}/META-INF/persistence.xml" tofile="${project.build.outputDirectory}/META-INF/persistence.xml"/>         </tasks>       </configuration>       <goals>         <goal>run</goal>       </goals>     </execution>     <execution>       <id>restore-persistence</id>       <phase>prepare-package</phase>       <configuration>         <tasks>           <!--restore the "proper" persistence.xml-->           <copy file="${project.build.outputDirectory}/META-INF/persistence.xml.proper" tofile="${project.build.outputDirectory}/META-INF/persistence.xml"/>         </tasks>       </configuration>       <goals>         <goal>run</goal>       </goals>     </execution>   </executions> </plugin> 
like image 59
Rich Seller Avatar answered Sep 26 '22 02:09

Rich Seller