Подтвердить что ты не робот

Powermock и Spring вызывают исключение ConversionException при инъекции EntityManager в тесте

При попытке объединить тестовый бегун Spring и бегун PowerMock с помощью метода PowerMockRule я получаю исключение из библиотеки Thoughtworks XStream всякий раз, когда я пытаюсь ввести EntityManager с помощью аннотации PersistenceContext из JPA. Тот же тест отлично работает, если не используется PowerMockRule. Я также игнорирую все пакеты с PowerMockLoader в начале теста. Я пробовал различные значения для @PowerMockIgnore, так как это обычно решает проблемы, которые у меня есть с PowerMock, однако эта ошибка все еще происходит даже при игнорировании абсолютно каждого пакета.

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

Исключением является следующее: ссылки на полный backtrace на pastebin, backtrace превысил предел для длины вопроса):

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>

Тестирование с использованием Spring 3.2.3.RELEASE. Обратите внимание, что я также тестировал версию spring -test 3.0.5.RELEASE, которая действительно разрешает некоторые другие ошибки с комбинацией Spring/Powermock, но не с этим.

4b9b3361

Ответ 1

У меня была аналогичная проблема, и мне было предложено создать класс Resource.java, созданный менеджером сущностей.

@Stateful
public class Resources implements Serializable {

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

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

}

Я все еще не совсем уверен, почему это решение сработало для меня... но это произошло.

V/R Ace