When attempting to combine the Spring test runner and the PowerMock runner using the PowerMockRule technique, I get an exception from the Thoughtworks XStream library whenever I try to inject an EntityManager
using the PersistenceContext
annotation from JPA. The same test works fine when not using the PowerMockRule
. I also ignore all packages from the PowerMockLoader at the start of the test. I tried various values for @PowerMockIgnore
as this normally solves issues I have with PowerMock, however, this error still happens even when ignoring absolutely every package.
@PowerMockIgnore("*") @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("/test-configuration.xml") public class SpringAndPowerMockTest { @Rule public PowerMockRule rule = new PowerMockRule(); @PersistenceContext private EntityManager manager; @Test public void test() { } }
The exception is as follows -- links to full backtrace on pastebin the backtrace exceeded the limit for question length):
com.thoughtworks.xstream.converters.ConversionException: Could not call org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.readObject() : Could not call java.util.concurrent.CopyOnWriteArrayList.readObject() : Could not call java.security.CodeSource.readObject() : null
Relevant persistence unit:
<persistence-unit name="inMemory"> <provider>org.hibernate.ejb.HibernatePersistence</provider> <properties> <property name="hibernate.connection.driver_class" value="org.h2.Driver" /> <property name="hibernate.connection.url" value="jdbc:h2:mem:InMemoryUnitTests;MODE=MySQL;DB_CLOSE_ON_EXIT=FALSE" /> <property name="hibernate.connection.username" value="sa" /> <property name="hibernate.connection.password" value="" /> <property name="hibernate.hbm2ddl.auto" value="create-drop" /> </properties> </persistence-unit>
Maven dependencies:
<dependencies> <dependency> <groupId>org.powermock</groupId> <artifactId>powermock-module-junit4</artifactId> <version>1.5.1</version> <scope>test</scope> </dependency> <dependency> <groupId>org.powermock</groupId> <artifactId>powermock-api-mockito</artifactId> <version>1.5.1</version> <scope>test</scope> </dependency> <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-core</artifactId> <version>1.9.5</version> <scope>test</scope> </dependency> <dependency> <groupId>org.powermock</groupId> <artifactId>powermock-api-easymock</artifactId> <version>1.5.1</version> <scope>test</scope> </dependency> <dependency> <groupId>org.powermock</groupId> <artifactId>powermock-module-junit4-rule</artifactId> <version>1.5.1</version> <scope>test</scope> </dependency> <dependency> <groupId>org.powermock</groupId> <artifactId>powermock-classloading-xstream</artifactId> <version>1.5.1</version> <scope>test</scope> </dependency> </dependencies>
Testing using Spring 3.2.3.RELEASE
. Note that I have also tested with spring-test version 3.0.5.RELEASE
which does indeed resolve some other errors with the Spring/Powermock combination, but not this one.
I had a similar issue and it was suggested to me to create a Resources.java class that Produced an Entity Manager.
@Stateful public class Resources implements Serializable { @PersistenceContext (type = PersistenceContextType.TRANSACTION) private EntityManager entityManager; @Produces public EntityManager getEntityManager() { return entityManager; } }
I'm still not exactly sure why this solution worked for me... but it did.
v/r Ace
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With