2013-07-15 68 views
32

注入的EntityManager時,當試圖春節測試運行,並使用PowerMockRule technique的PowerMock亞軍結合,我從ThoughtWorks的XStream的庫異常每當我試圖使用從PersistenceContext註釋注入的EntityManager JPA。當不使用PowerMockRule時,相同的測試正常工作。在測試開始時,我也忽略了PowerMockLoader的所有軟件包。我爲@PowerMockIgnore嘗試了各種值,因爲這通常可以解決PowerMock遇到的問題,但即使忽略每個軟件包也會發生此錯誤。 Powermock和Spring原因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> 

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> 

使用彈簧3.2.3.RELEASE進行測試。請注意,我還測試了彈簧測試版本3.0.5.RELEASE,這確實可以解決Spring/Powermock組合中的其他一些錯誤,但不是這一個。

+0

您使用的是什麼版本的XStream?你有沒有自定義的XStream轉換器註冊?我遇到了一個自定義XStream轉換器的問題。自定義轉換器在其他轉換器之前被調用,但由於我是繼承XStream提供的MapConverter,其canConvert方法不是Null安全的,我得到一個空指針異常(通常NullConverter位於列表的頂部)。解決方案是使我的自定義轉換器的canConvert方法無效。但從您的堆棧跟蹤來看,這看起來像是其他東西... –

+0

xstream版本通過'powermock-classloading-xstream'依賴關係可傳遞到1.4.2。我沒有任何其他的代碼,除了顯示的測試,所以沒有任何自定義轉換器... – amoe

+1

在我的經驗與Powermock 1.5,它不符合Xstream 1.4.2,我一直無法追查原因;奇怪的是,這是powermock-classloading-xstream解決的問題。我建議嘗試添加XStream 1.2.2作爲你的pom的直接依賴。 –

回答

1

我有一個類似的問題,並建議我創建一個Resources.java類,生成一個實體管理器。

@Stateful 
public class Resources implements Serializable { 

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

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

} 

我仍然不完全確定爲什麼這個解決方案爲我工作......但它確實。

v/r Ace