Pertanyaan Powermock dan Spring menyebabkan ConversionException ketika menyuntikkan EntityManager dalam pengujian


Ketika mencoba untuk menggabungkan pelari uji Spring dan pelari PowerMock menggunakan Teknik PowerMockRule, Saya mendapatkan pengecualian dari pustaka Thoughtworks XStream setiap kali saya mencoba menyuntikkan EntityManager menggunakan PersistenceContext penjelasan dari JPA. Tes yang sama berfungsi dengan baik saat tidak menggunakan PowerMockRule. Saya juga mengabaikan semua paket dari PowerMockLoader pada awal tes. Saya mencoba berbagai nilai untuk @PowerMockIgnore karena ini biasanya menyelesaikan masalah yang saya miliki dengan PowerMock, namun, kesalahan ini masih terjadi bahkan ketika mengabaikan benar-benar setiap paket.

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

Pengecualiannya adalah sebagai berikut - tautan ke backtrace penuh pada pastebin backtrace melebihi batas untuk panjang pertanyaan):

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

Unit persistensi yang relevan:

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

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

Pengujian menggunakan Spring 3.2.3.RELEASE. Perhatikan bahwa saya juga telah diuji dengan versi semi-test 3.0.5.RELEASE yang memang menyelesaikan beberapa kesalahan lain dengan kombinasi Spring / Powermock, tetapi tidak yang satu ini.


32
2017-07-15 15:06


asal


Jawaban:


Saya memiliki masalah serupa dan disarankan kepada saya untuk membuat kelas Resources.java yang Menghasilkan Manajer Entitas.

@Stateful
public class Resources implements Serializable {

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

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

}

Saya masih belum tahu pasti mengapa solusi ini berhasil untuk saya ... tetapi ternyata berhasil.

v / r Kartu as


1
2017-12-11 17:09