2013-07-15 25 views
32

Khi cố gắng để kết hợp các runner thử nghiệm mùa xuân và Á hậu PowerMock sử dụng PowerMockRule technique, tôi nhận được một ngoại lệ từ thư viện Thoughtworks XStream bất cứ khi nào tôi cố gắng tiêm một EntityManager sử dụng PersistenceContext chú thích từ JPA. Các thử nghiệm tương tự hoạt động tốt khi không sử dụng PowerMockRule. Tôi cũng bỏ qua tất cả các gói từ PowerMockLoader khi bắt đầu thử nghiệm. Tôi đã thử các giá trị khác nhau cho @PowerMockIgnore vì điều này thường giải quyết được các vấn đề tôi có với PowerMock, tuy nhiên, lỗi này vẫn xảy ra ngay cả khi bỏ qua hoàn toàn mọi gói. Powermock và mùa xuân nguyên nhân ConversionException khi tiêm EntityManager trong thử nghiệm

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

Trường hợp ngoại lệ là như sau - liên kết đến các vết lùi đầy đủ trên Pastebin các vết lùi vượt quá giới hạn cho chiều dài câu hỏi):

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

liên quan kiên trì đơn vị:

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

Phụ thuộc 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> 

Thử nghiệm sử dụng Spring 3.2.3.RELEASE. Lưu ý rằng tôi cũng đã thử nghiệm với phiên bản thử nghiệm mùa xuân 3.0.5.RELEASE thực sự giải quyết một số lỗi khác với kết hợp Spring/Powermock, nhưng không phải là lỗi này.

+0

Bạn đang sử dụng phiên bản XStream nào? Bạn có đăng ký bộ chuyển đổi XStream tùy chỉnh nào không? Tôi đã gặp phải sự cố khi tôi có trình chuyển đổi XStream tùy chỉnh. Các trình biến đổi tùy biến được gọi trước các trình biến đổi khác, nhưng vì tôi đã phân lớp XStream cung cấp MapConverter có phương thức canConvert không an toàn, tôi đã nhận được một ngoại lệ con trỏ null (thường là NullConverter ở trên cùng của danh sách). Giải pháp là làm cho phương thức canConvert của trình biến đổi tùy chỉnh của tôi không an toàn. Nhưng đánh giá từ dấu vết ngăn xếp của bạn trông giống như một cái gì đó khác ... –

+0

Phiên bản xstream phân giải quá mức đến 1.4.2 thông qua phụ thuộc 'powermock-classloading-xstream'. Tôi không có bất kỳ mã nào khác ngoại trừ kiểm tra được hiển thị, do đó, không có bất kỳ bộ chuyển đổi tùy chỉnh nào ... – amoe

+1

Theo kinh nghiệm của tôi với Powermock 1.5, nó không tương thích với Xstream 1.4.2, tôi đã không thể theo dõi nguyên nhân; kỳ quặc sau đó đó là những gì powermock-classloading-xstream giải quyết. Tôi khuyên bạn nên thử thêm XStream 1.2.2 làm phụ thuộc trực tiếp vào pom của bạn. –

Trả lời

1

Tôi gặp sự cố tương tự và tôi đã đề xuất để tạo lớp Tài nguyên.java đã tạo ra Trình quản lý đối tượng.

@Stateful 
public class Resources implements Serializable { 

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

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

} 

Tôi vẫn chưa chắc chắn tại sao giải pháp này làm việc cho tôi ... nhưng nó đã làm.

v/r Ace

Các vấn đề liên quan