java - 在测试中注入(inject) EntityManager 时,Powermock 和 Spring 导致 ConversionException

标签 java spring jpa powermock

当尝试使用 PowerMockRule technique 组合 Spring 测试运行器和 PowerMock 运行器时,每当我尝试使用 JPA 中的 PersistenceContext 注释注入(inject) EntityManager 时,我都会从 Thoughtworks XStream 库中得到一个异常。不使用 PowerMockRule 时,同样的测试工作正常。在测试开始时,我也忽略了 PowerMockLoader 中的所有包。我尝试了 @PowerMockIgnore 的各种值,因为这通常可以解决我在使用 PowerMock 时遇到的问题,但是,即使完全忽略每个包,这个错误仍然会发生。

@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() {
    }
}

异常(exception)情况如下——指向pastebin上完整回溯的链接,回溯超过了问题长度的限制):

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

相关的持久化单元:

<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>
<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>

使用 Spring 3.2.3.RELEASE 进行测试。请注意,我还使用 spring-test 版本 3.0.5.RELEASE 进行了测试,它确实解决了 Spring/Powermock 组合的一些其他错误,但不是这个。

最佳答案

我遇到了类似的问题,有人建议我创建一个 Resources.java 生成实体管理器的类。

@Stateful
public class Resources implements Serializable {

    @PersistenceContext (type = PersistenceContextType.TRANSACTION)
    private EntityManager entityManager;

    @Produces
    public EntityManager getEntityManager() {
        return entityManager;
    }

}

我仍然不确定为什么这个解决方案对我有用……但确实有效。

v/r 王牌

关于java - 在测试中注入(inject) EntityManager 时,Powermock 和 Spring 导致 ConversionException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17657501/

相关文章:

java - SLF4J 的 NoSuchMethodError

java - 使用 CriteriaBuilder 过滤数据以将枚举值与文字进行比较不起作用

java - 在Java中将映射的键和值解析为一个大字符串

java - 如何使用 viewModel 中的观察者方法解决 "anonymous class derived from observer"错误

java - 为什么我没有使用 Android 中的界面从之前的 Activity 中获取其他 Activity 中的数据

java - Android 上的 ARCore 是否支持像 ARKit 一样的实时反射?

xml - 强制 JacksonXML 将原始 XML 反序列化为字符串

java - Spring-AngularJS-文件上传-org.apache.commons.fileupload.FileUploadException : the request was rejected because no multipart boundary was found

spring - 是否可以使用 Java 配置而不是 persistence.xml 进行 Hibernate OGM 持久性设置?

java - 在 JPA 中重用持久性上下文