2013-07-15 3 views
32

에 EntityManager를 주입, 나는 ThoughtWorks의 XStream을 라이브러리에서 예외가 JPA. 동일한 테스트는 PowerMockRule을 사용하지 않을 때 잘 작동합니다. 또한 테스트 시작시 PowerMockLoader의 모든 패키지를 무시합니다. 내가 @PowerMockIgnore에 대한 다양한 값을 시도했는데, 이는 보통 PowerMock에서 발생하는 문제를 해결하지만, 모든 패키지를 절대 무시하더라도이 오류는 여전히 발생합니다. 다음과 같이 Powermock 봄 원인 ConversionException 테스트

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

는 예외입니다 - 역 추적을 페이스트 빈에 전체 역 추적에 대한 링크가 질문의 길이에 대한 제한) 초과 :

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> 

종속성 :

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

스프링을 사용하여 테스트 3.2.3.RELEASE. 또한 스프링 테스트 버전 3.0.5.RELEASE으로 테스트했는데 실제로 스프링/Powermock 조합으로 다른 오류가 해결되지만 실제로는 그렇지 않습니다.

+0

사용하는 XStream을 어떤 버전? 사용자 정의 XStream 변환기가 등록되어 있습니까? 사용자 정의 XStream 변환기가있는 곳에서 문제가 발생했습니다. 사용자 정의 변환기는 다른 변환기보다 먼저 호출되지만, XStream에서 제공 한 MapConverter의 서브 클래스를 작성한 이후로 canConvert 메소드가 널 안전하지 않은 경우 널 포인터 예외 (일반적으로 NullConverter가 목록 맨 위에 있음)가 발생했습니다. 해결 방법은 사용자 지정 변환기의 canConvert 메서드를 null 값으로 설정하는 것입니다. 그러나 당신의 스택 트레이스로부터 판단 해 보면, 이것은 다른 것으로 보입니다 ... –

+0

xstream 버전은'powermock-classloading-xstream' 의존성을 통해 1.4.2로 전환됩니다. 표시된 테스트를 제외하고는 다른 코드가 없으므로 사용자 지정 변환기가 없습니다. – amoe

+1

Powermock 1.5에 대한 제 경험으로는 Xstream 1.4.2와 호환되지 않습니다. 원인을 추적하십시오. 그 이상한 것은 powermock-classloading-xstream이 해결하는 것입니다. 나는 당신의 pom에 직접 의존성으로서 XStream 1.2.2를 추가하는 것을 제안한다. –

답변

1

필자도 비슷한 문제가 있었으며 Entity Manager를 만든 Resources.java 클래스를 만들 것을 제안했습니다.

@Stateful 
public class Resources implements Serializable { 

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

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

} 

저는 왜이 솔루션이 저에게 효과가 있었는지 아직 확실하지 않습니다.

의 v/R 에이스