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
Vous devez vous connecter pour publier un commentaire.
Trouvé la solution moi-même:
Utiliser le dessous des dépendances (pour Pouvoir se Moquer et de la Puissance de la Règle) seulement
Maintenant je ne reçois pas de l'une des exceptions ci-dessus
merci homme qui vraiment m'a beaucoup aidé 🙂
N'oubliez pas de upvote 🙂
OriginalL'auteur Bhuvan
Remplacer powermock-module-junit4-règle avec powermock-module-junit4-la règle de l'agent.
La principale différence entre l'agent en fonction du programme d'amorçage et le classloading en fonction du programme d'amorçage, c'est que vous ne courez pas dans classloading questions.
OriginalL'auteur tak3shi
Sans plus d'exemples de code, je suppose que le code est à l'aide de Printemps dans le test. Donc, je crois que la raison de cette erreur est liée à de Printemps de l'utilisation, qui ne semblent avoir généré JDK procurations (la
$Proxy88
).Et la façon Powermock est travail est en cours d'exécution du test JUnit dans un nouveau chargeur de classe afin de modifier le pseudo-code de ces classes, malheureusement, il est seulement possible de modifier le pseudo-code binaire à partir d'un le fichier réel, ou au moins à partir d'un endroit où il est possible de lire à la classe binaire, comme java ne peut pas accéder bytecode déjà chargé dans la JVM. (Il peut être possible avec un agent de manière limitée).
Comme JDK proxy n'existe pas sur le disque, ils ne peuvent pas être lus, copiés ou de la spécifiques Powermock classloader.
Le test que vous écrivez n'est pas une unité de test, tel qu'il est exécuté avec un Printemps contexte. Vous pourriez écrire un vrai de Test de l'Unité premier. Puis certains Test d'Intégration, dans lequel vous n'aurez pas besoin de se moque de.
Aussi, vous devez éviter l'utilisation de la statique, comme c'est une testabilité cauchemar. Vous devez réécrire votre code de production dans une voie où les appels statiques n'ont pas besoin d'être moqué.
Acclamations,
OriginalL'auteur Brice
OriginalL'auteur gjosh