2012-08-30 23 views
7

he integrado PowerMock y PowerRule en Junit con MockitoConseguir javassist que no se encuentra con PowerMock y PowerRule en Junit con Mockito

siguientes son las dependencias:

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

// My test class is: 

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(); 
} 
} 

donde doSomething está llamando a un método estático que Necesito burlarme. ahora, cuando estoy corriendo mi caso de prueba que estoy recibiendo javassist.NotFoundException: $ Proxy88

completo seguimiento de la pila:

java.lang.RuntimeException: javassist.NotFoundException: $ Proxy88 en org.powermock .core.classloader.MockClassLoader.loadUnmockedClass (MockClassLoader.java:187) en org.powermock.core.classloader.MockClassLoader.loadModifiedClass (MockClassLoader.java:147) en org.powermock.core.classloader.DeferSupportingClassLoader.loadClass (DeferSupportingClassLoader .java: 67) en java.lang.ClassLoader.loadClass (ClassL oader.java:252) en java.lang.ClassLoader.loadClassInternal (ClassLoader.java:320) en java.lang.Class.forName0 (método nativo) en java.lang.Class.forName (Class.java:247) en org.powermock.api.support.ClassLoaderUtil.loadClass (ClassLoaderUtil.java:66) en org.powermock.api.support.ClassLoaderUtil.loadClass (ClassLoaderUtil.java:26) en org.powermock.classloading.DeepCloner .cloneFields (DeepCloner.java:243) en org.powermock.classloading.DeepCloner.performClone (DeepCloner.java:128) en org.powermock.classloading.DeepCloner.cloneFields (DeepCloner.java:248) en org.powermock .classloading.DeepCloner.performClone (DeepCloner.java:128) en org.powermock.classloading.DeepCloner.clon eFields (DeepCloner.java:248) en org.powermock.classloading.DeepCloner.performClone (DeepCloner.java:128) en org.powermock.classloading.DeepCloner.cloneFields (DeepCloner.java:248) en org.powermock. classloading.DeepCloner.performClone (DeepCloner.java:128) en org.powermock.classloading.DeepCloner.cloneFields (DeepCloner.java:248) en org.powermock.classloading.DeepCloner.performClone (DeepCloner.java:128) en org.powermock.classloading.DeepCloner.cloneFields (DeepCloner.java:248) en org.powermock.classloading.DeepCloner.performClone (DeepCloner.java:128) en org.powermock.classloading.DeepCloner.cloneFields (DeepCloner.java: 248) en org.powermock.classloading.DeepCloner.performClone (DeepCloner.java:128) en org.powermock.classloading.DeepCloner.clone (DeepCloner.java:82) en org.powermock.classloading.DeepCloner.clone (DeepCloner.java:69) en org.powermock.classloading.ClassloaderExecutor.execute (ClassloaderExecutor. java: 89) en org.powermock.classloading.ClassloaderExecutor.execute (ClassloaderExecutor.java:78) en org.powermock.modules.junit4.rule.PowerMockStatement.evaluate (PowerMockRule.java:49) en org.springframework. test.context.junit4.statements.SpringRepeat.evaluate (SpringRepeat.java:72) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild (SpringJUnit4ClassRunner.java:231) en org.junit.runners.BlockJUnit4ClassRunner. runChild (BlockJUnit4ClassRunner.java:50) en org.junit.runn ers.ParentRunner $ 3.run (ParentRunner.java:193) en org.junit.runners.ParentRunner $ 1.schedule (ParentRunner.java:52) en org.junit.runners.ParentRunner.runChildren (ParentRunner.java:191) en org.junit.runners.ParentRunner.access $ 000 (ParentRunner.java:42) en org.junit.runners.ParentRunner $ 2.evaluar (ParentRunner.java:184) en org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate (RunBeforeTestClassCallbacks. java: 61) en org.junit.internal.runners.statements.RunAfters.evaluate (RunAfters.java:31) en org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate (RunAfterTestClassCallbacks.java:71) en org.junit.runners.ParentRunner.run (ParentRunner.java:236) en org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run (SpringJUnit4ClassRunner.java:174) en org.eclipse.jdt.internal. junit4.runner.JUnit4TestReference.run (JUnit4TestReference.java:50) en org.eclipse.jdt.internal. junit.runner.TestExecution.run (TestExecution.java:38) en org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests (RemoteTestRunner.java:467) en org.eclipse.jdt.internal.junit. runner.RemoteTestRunner.runTests (RemoteTestRunner.java:683) en org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run (RemoteTestRunner.java:390) en org.eclipse.jdt.internal.junit.runner. RemoteTestRunner.main (RemoteTestRunner.java:197) Causado por: javassist.NotFoundException: $ Proxy88 en javassist.ClassPool.get (ClassPool.java:436) en org.powermock.core.classloader.MockClassLoader.loadUnmockedClass (MockClassLoader. java: 180) ... 46 más

Si cambio la dependecy a

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

cuando me siento un differnt excepción. Consulte - https://stackoverflow.com/questions/12176049/suggest-work-around-for-com-thoughtworks-xstream-converters-conversionexception

Incluso he intentado con la versión javassist 15 pero conseguir mismo problema

Por favor, ayuda ..

Respuesta

7

descubrió la solución a mí mismo:

uso de las dependencias siguientes (para la alimentación Mock y regla de la potencia) solamente

<!-- Required for PowerMock --> 
    <dependency> 
     <groupId>org.powermock</groupId> 
     <artifactId>powermock-api-mockito</artifactId> 
     <version>1.4.12</version> 
     <scope>test</scope> 
    </dependency> 
    <!-- Required for PowerMockRule --> 
    <dependency> 
     <groupId>org.powermock</groupId> 
     <artifactId>powermock-module-junit4-rule-agent</artifactId> 
     <version>1.4.12</version> 
     <scope>test</scope> 
    </dependency> 

Ahora no estoy recibiendo ninguna de las excepciones anteriores

+0

Tuve el mismo problema, agregando que las dependencias anteriores resolvieron el problema. Pero me estoy enfrentando a otro problema, es decir, el código no está llegando al punto de ruptura de depuración. – aamir

+0

gracias hombre que realmente me ayudó mucho :) –

+0

No te olvides de votar :) – Bhuvan

2

Sin más ejemplos de código deduzco que el código es el uso de la primavera en la prueba. Por lo tanto, creo que el motivo de este error está relacionado con el uso de Spring, que parece haber generado proxies JDK (el $Proxy88).

Y la forma en que Powermock está funcionando es ejecutando la prueba JUnit en un nuevo cargador de clases para modificar el bytecode de estas clases, desafortunadamente solo es posible modificar el bytecode de un archivo real, o al menos de un ubicación donde es posible leer el binario de la clase, ya que java no puede acceder al bytecode ya cargado en la JVM. (Puede ser posible con un agente de una manera limitada).

Como los proxies JDK no existen en el disco, no se pueden leer ni copiar al cargador de clases Powermock específico.

La prueba que está escribiendo no es una prueba de unidad, ya que se ejecuta con un contexto de primavera. Es posible que desee escribir un verdadero Unit Test primero. A continuación, algunos Prueba de integración, en el que no necesitará simulaciones.

También debe evitar el uso de estática, ya que es una pesadilla de capacidad de prueba. Debería volver a escribir su código de producción de forma que las llamadas estáticas no tengan que ser burladas.

Saludos,

+0

gracias por su explicación. – ejaenv

0
@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = "classpath:/test-servlet.xml") 
public class ControlCenterManagerImplTest { 

@Rule 
public PowerMockRule rule = new PowerMockRule(); 

//Powermock agent initialization not required and using maven dependency specified above by BHUVAN we can execute Power mock using spring.} 
4

Reemplace powermock-module-junit4-rule con powermock-module-junit4-ru le-agente.

<dependency> 
    <groupId>org.powermock</groupId> 
    <artifactId>powermock-module-junit4-rule-agent</artifactId> 
    <scope>test</scope> 
</dependency> 

La principal diferencia entre el programa previo basado agente y el programa previo basado en la carga de clase es que no tenga problemas de carga de clase.

+0

¡Gracias @ tak3shi me funcionó! También necesitaba usar el indicador -javaagent. – ejaenv

Cuestiones relacionadas