2013-07-15 13 views
32

yılında EntityManager enjekte ben THOUGHTWORKS XStream kütüphanesinden bir istisna olsun JPA. Aynı test, PowerMockRule kullanılmadığında iyi çalışır. Ayrıca testin başında tüm paketleri PowerMockLoader'dan görmezden geliyorum. @PowerMockIgnore için çeşitli değerler denedim, çünkü bu normalde PowerMock ile ilgili sorunları çözer, ancak bu hata kesinlikle her paketi göz ardı etseniz bile gerçekleşir. aşağıdaki gibi Powermock ve Bahar neden ConversionException testinde

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

istisna - geri izleme Pastebin üzerinde tam backtrace bağlantılar soru uzunluğu için sınırı) aştı:

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

İlgili kalıcılık birimi:

<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 bağımlılıkları:

<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 Yayını kullanarak sınama. Ayrıca, Spring-Powermock kombinasyonu ile diğer bazı hataları çözen, fakat bu değil, bahar test sürümü 3.0.5.RELEASE ile test ettiğime dikkat edin.

+0

kullandığınız XStream sürümü nedir? Kayıtlı herhangi bir özel XStream dönüştürücünüz var mı? Özel bir XStream dönüştürücümün olduğu bir sorunla karşılaştım. Özel dönüştürücüler, diğer dönüştürücülerden önce çağrılır, ancak ben, CanConvert yöntemi boş olmayan XStream tarafından sağlanan MapConverter alt sınıfını kullandığım için boş bir işaretçi istisnası alıyorum (normalde NullConverter listenin en üstünde). Çözüm, özel dönüştürücümün canConvert yöntemini geçersiz kılmaktı. Ancak yığın izlerinizden yola çıkarak bu durum başka bir şeye benziyor ... –

+0

xstream sürümü, "powermock-classloading-xstream" bağımlılığı aracılığıyla 1.4.2'ye dönüşüyor. Gösterilen test haricinde başka bir kodum yok, bu yüzden herhangi bir özel dönüştürücünüz yok ... – amoe

+1

Powermock 1.5 deneyimlerime göre, Xstream 1.4.2 ile uyumlu değil. Nedeni takip et; garip o zaman o powermock-classloading-xstream için çözer. XStream 1.2.2'yi pompanıza doğrudan bağımlılık olarak eklemeyi denemenizi tavsiye ederim. –

cevap

1

Benzer bir sorunla karşılaştım ve bir Entity Manager Üreten Resources.java sınıfı oluşturmam önerildi.

@Stateful 
public class Resources implements Serializable { 

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

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

} 

Hala bu çözümün neden benim için çalıştığından tam olarak emin değilim ... ama yaptı.

v/r Ace

İlgili konular