Obtenir javassist.NotFoundException avec PowerMock et PowerRule dans JUnit avec Mockito

J'ai intégré PowerMock et PowerRule dans JUnit avec Mockito.

Voici mes dépendances:

<dependency>
        <groupId>javassist</groupId>
        <artifactId>javassist</artifactId>
        <version>3.12.0.GA</version>
      </dependency>
<dependency>
        <groupId>asm</groupId>
        <artifactId>asm</artifactId>
        <version>3.3.1</version>
</dependency>

 <dependency>
        <groupId>cglib</groupId>
        <artifactId>cglib</artifactId>
        <version>2.2.2</version>
 </dependency>
 <dependency>
        <groupId>org.powermoc</groupId>
    <artifactId>powermock-module-junit4</artifactId>
    <version>1.4.12</version>
    <scope>test</scope>
    </dependency>
 <dependency>
    <groupId>org.powermock</groupId>
    <artifactId>powermock-api-mockito</artifactId>
    <version>1.4.12</version>
    <scope>test</scope>
 </dependency>
 <dependency>
       <groupId>org.powermock</groupId>
       <artifactId>powermock-module-junit4-rule</artifactId>
       <version>1.4.12</version>
       <scope>test</scope>
 </dependency>
 <dependency>
        <groupId>org.powermock</groupId>
        <artifactId>powermock-classloading-objenesis</artifactId>
        <version>1.4.12</version>
        <scope>test</scope>
 </dependency>

Ma classe de test est:

public class TestClass extends AbstractShiroTest{
    @Rule
    public PowerMockRule rule = new PowerMockRule();
    @Autowired
    SomeService someService;
    @Before

    public void setUp(){
    Map<String, Object> newMap = new HashMap<String, Object>();
    newMap.put("userTimeZone", "Asia/Calcutta");
    Subject subjectUnderTest = mock(Subject.class);
             when(subjectUnderTest.getPrincipal()).thenReturn(LMPTestConstants.USER_NAME);
    Session session = mock(Session.class);
    when(session.getAttribute(LMPCoreConstants.USER_DETAILS_MAP)).thenReturn(newMap);
    when(subjectUnderTest.getSession(false)).thenReturn(session);
    setSubject(subjectUnderTest);
    PowerMockito.mockStatic(CasSessionUtil.class);
    when(CasSessionUtil.getCarrierId()).thenReturn(1L);
}

  @Test

public void myTestMethod()  {
someService.doSomething();
 }
}

doSomething est l'appel d'une méthode statique que j'ai besoin de simuler.
Quand je lance mon test, j'obtiens javassist.NotFoundException: $Proxy88.

Full stack trace:

java.lang.RuntimeException: javassist.NotFoundException: $Proxy88
au org.powermock.de base.chargeur de classe.MockClassLoader.loadUnmockedClass(MockClassLoader.java:187)
au org.powermock.de base.chargeur de classe.MockClassLoader.loadModifiedClass(MockClassLoader.java:147)
au org.powermock.core.classloader.DeferSupportingClassLoader.loadClass(DeferSupportingClassLoader.java:67)
à java.lang.Chargeur de classe.loadClass(ClassLoader.java:252)
à java.lang.Chargeur de classe.loadClassInternal(ClassLoader.java:320)
à java.lang.Classe.forName0(Native method)
à java.lang.Classe.forName(de la Classe.java:247)
au org.powermock.l'api.de soutien.ClassLoaderUtil.loadClass(ClassLoaderUtil.java:66)
au org.powermock.l'api.de soutien.ClassLoaderUtil.loadClass(ClassLoaderUtil.java:26)
au org.powermock.classloading.DeepCloner.cloneFields(DeepCloner.java:243)
au org.powermock.classloading.DeepCloner.performClone(DeepCloner.java:128)
au org.powermock.classloading.DeepCloner.cloneFields(DeepCloner.java:248)
au org.powermock.classloading.DeepCloner.performClone(DeepCloner.java:128)
au org.powermock.classloading.DeepCloner.cloneFields(DeepCloner.java:248)
au org.powermock.classloading.DeepCloner.performClone(DeepCloner.java:128)
au org.powermock.classloading.DeepCloner.cloneFields(DeepCloner.java:248)
au org.powermock.classloading.DeepCloner.performClone(DeepCloner.java:128)
au org.powermock.classloading.DeepCloner.cloneFields(DeepCloner.java:248)
au org.powermock.classloading.DeepCloner.performClone(DeepCloner.java:128)
au org.powermock.classloading.DeepCloner.cloneFields(DeepCloner.java:248)
au org.powermock.classloading.DeepCloner.performClone(DeepCloner.java:128)
au org.powermock.classloading.DeepCloner.cloneFields(DeepCloner.java:248)
au org.powermock.classloading.DeepCloner.performClone(DeepCloner.java:128)
au org.powermock.classloading.DeepCloner.clone(DeepCloner.java:82)
au org.powermock.classloading.DeepCloner.clone(DeepCloner.java:69)
au org.powermock.classloading.ClassloaderExecutor.execute(ClassloaderExecutor.java:89)
au org.powermock.classloading.ClassloaderExecutor.execute(ClassloaderExecutor.java:78)
au org.powermock.les modules.junit4.la règle.PowerMockStatement.évaluer(PowerMockRule.java:49)
au org.springframework.test.contexte.junit4.des déclarations.SpringRepeat.évaluer(SpringRepeat.java:72)
au org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:231)
au org.junit.les coureurs.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
au org.junit.les coureurs.ParentRunner$3.exécuter(ParentRunner.java:193)
au org.junit.les coureurs.ParentRunner$1.annexe(ParentRunner.java:52)
au org.junit.les coureurs.ParentRunner.runChildren(ParentRunner.java:191)
au org.junit.les coureurs.ParentRunner.l'accès$000(ParentRunner.java:42)
au org.junit.les coureurs.ParentRunner$2.évaluer(ParentRunner.java:184)
au org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
au org.junit.interne.les coureurs.des déclarations.RunAfters.évaluer(RunAfters.java:31)
au org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:71)
au org.junit.les coureurs.ParentRunner.exécuter(ParentRunner.java:236)
au org.springframework.test.contexte.junit4.SpringJUnit4ClassRunner.exécuter(SpringJUnit4ClassRunner.java:174)
au org.eclipse.jdt.interne.junit4.runner.JUnit4TestReference.exécuter(JUnit4TestReference.java:50)
au org.eclipse.jdt.interne.junit.runner.TestExecution.exécuter(TestExecution.java:38)
au org.eclipse.jdt.interne.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
au org.eclipse.jdt.interne.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
au org.eclipse.jdt.interne.junit.runner.RemoteTestRunner.exécuter(RemoteTestRunner.java:390)
au org.eclipse.jdt.interne.junit.runner.RemoteTestRunner.principale(RemoteTestRunner.java:197)
Causés par: javassist.NotFoundException: $Proxy88
au javassist.ClassPool.get(ClassPool.java:436)
au org.powermock.de base.chargeur de classe.MockClassLoader.loadUnmockedClass(MockClassLoader.java:180)
... 46 plus

Si je change la dépendance à

<dependency>
            <groupId>org.powermock</groupId>
            <artifactId>powermock-classloading-xstream</artifactId>
            <version>1.4.12</version>
            <scope>test</scope>
        </dependency>

puis-je obtenir un autre exception. Veuillez voir https://stackoverflow.com/questions/12176049/suggest-work-around-for-com-thoughtworks-xstream-converters-conversionexception (supprimé DONC, la question, nécessite 10k).

J'ai même essayé avec javassist la version 15, mais qui a le même problème.

OriginalL'auteur Bhuvan | 2012-08-30