I am using below versions of powermock and junit with javaassist. Most of the test cases are working fine except few which are written for classes that uses CloseableHttpClient. I have tried different combinations of powermock + javaassist but nothing seems to work . My project is legacy and hence not using maven.

javassist-3.24.0-GA
powermock-api-mockito-1.6.2
powermock-mockito-release-full-1.6.4-full
powermock-module-junit4-1.7.4
powermock-module-testng-1.6.6
junit-4.12.jar

Code-

import static org.mockito.Matchers.anyObject;
import static org.mockito.Matchers.anyString;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.rmi.registry.Registry;

import javax.xml.parsers.ParserConfigurationException;

import org.apache.http.HttpEntity;
import org.apache.http.StatusLine;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.config.RequestConfig.Builder;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.config.RegistryBuilder;
import org.apache.http.conn.socket.ConnectionSocketFactory;
import org.apache.http.conn.socket.PlainConnectionSocketFactory;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.junit.runner.RunWith;
import org.mockito.Matchers;
import org.mockito.Mockito;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PowerMockIgnore;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.core.classloader.annotations.SuppressStaticInitializationFor;
import org.powermock.modules.junit4.PowerMockRunner;
import org.powermock.modules.testng.PowerMockTestCase;
import org.testng.Assert;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import org.w3c.dom.Document;

import com.yantra.yfc.log.YFCLogCategory;
import com.yantra.yfs.core.YFSSystem;
import com.yantra.yfs.japi.YFSEnvironment;
import com.yantra.yfs.japi.YFSUserExitException;


@RunWith(PowerMockRunner.class)
@PrepareForTest({HttpClientBuilder.class, PoolingHttpClientConnectionManager.class,Registry.class})
@PowerMockIgnore({"javax.management.*", "org.apache.http.conn.ssl.*", "com.amazonaws.*", "javax.net.ssl.*","com.sun.*"})
@SuppressStaticInitializationFor({ "com.yantra.yfs.core.YFSSystem" , "org.apache.http.client.config.RequestConfig",
"org.apache.http.conn.ssl.SSLConnectionSocketFactory", "org.apache.http.impl.client.HttpClients","org.apache.http.impl.client.HttpClientBuilder","org.apache.http.config.Registry","org.apache.http.config.RegistryBuilder","org.apache.http.HttpEntity"})
  public class ConfirmRefundDistributionUETest extends PowerMockTestCase{

    private ConfirmRefundDistributionUE confirmRefundDistributionUE;
    private YFSEnvironment yfsEnvironment;
    private YFCLogCategory yfc;
    ConfirmRefundDistributionUEYIFAPI mockYIFApi;
    
    
    CloseableHttpClient client ;
    CloseableHttpResponse response;
    HttpClientBuilder httpClientBuilder ;
    RequestConfig defaultRequestConfig;
    Builder customBuilder ;
    PoolingHttpClientConnectionManager poolManager;
    
    Registry rgt ;
    org.apache.http.config.Registry registry;
    RegistryBuilder rb ;
    StatusLine sl;
    HttpEntity he;
    


    @BeforeMethod
    public void beforeMethod() throws Exception {
        
        PowerMockito.mockStatic(SSLConnectionSocketFactory.class);
        PowerMockito.mockStatic(RequestConfig.class);
        PowerMockito.mockStatic(HttpClients.class);
        PowerMockito.mockStatic(RegistryBuilder.class);
        PowerMockito.mockStatic(PlainConnectionSocketFactory.class);
        PowerMockito.mockStatic(HttpClientBuilder.class);
        
        client = PowerMockito.mock(CloseableHttpClient.class);
        httpClientBuilder = PowerMockito.mock(HttpClientBuilder.class);

        
        PowerMockito.when(HttpClients.custom()).thenReturn(httpClientBuilder);
        Mockito.when(httpClientBuilder.setConnectionManager(anyObject())).thenReturn(httpClientBuilder);
        PowerMockito.when(httpClientBuilder.setDefaultRequestConfig(Matchers.anyObject())).thenReturn(httpClientBuilder);
        PowerMockito.when(httpClientBuilder.setProxy(Matchers.anyObject())).thenReturn(httpClientBuilder);
        PowerMockito.when(httpClientBuilder.build()).thenReturn(client);
        PowerMockito.when(client.execute(anyObject())).thenReturn(response);
        PowerMockito.when(response.getStatusLine()).thenReturn(sl);
        
        


    }

    @Test
    public void confirmRefundDistribution() throws ParserConfigurationException, SAXException, IOException, YFSUserExitException {

        // get the input.
        Document docUEInput = getDocument("InputUE");

        // invoke method to be tested.
        Document docActualUEOutput = confirmRefundDistributionUE.confirmRefundDistribution(yfsEnvironment, docUEInput);

        // Assert Output
        Document docExpectedUEOutput = getDocument("OutputUE");
        Assert.assertEquals(XMLUtil.getXMLString(docExpectedUEOutput), XMLUtil.getXMLString(docActualUEOutput));
    }

    
    
    }

Stack Trace-

javassist.CannotCompileException: by javassist.bytecode.BadBytecode: build ()Lorg/apache/http/impl/client/CloseableHttpClient; in org.apache.http.impl.client.HttpClientBuilder: inconsistent stack height 21
at javassist.CtBehavior.insertBefore(CtBehavior.java:809)
at javassist.CtBehavior.insertBefore(CtBehavior.java:766)
at org.powermock.core.transformers.impl.MainMockTransformer.modifyMethod(MainMockTransformer.java:197)
at org.powermock.core.transformers.impl.MainMockTransformer.allowMockingOfStaticAndFinalAndNativeMethods(MainMockTransformer.java:133)
at org.powermock.core.transformers.impl.MainMockTransformer.transform(MainMockTransformer.java:65)
at org.powermock.core.classloader.MockClassLoader.loadMockClass(MockClassLoader.java:252)
at org.powermock.core.classloader.MockClassLoader.loadModifiedClass(MockClassLoader.java:180)
at org.powermock.core.classloader.DeferSupportingClassLoader.loadClass(DeferSupportingClassLoader.java:70)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:344)
at sun.reflect.generics.factory.CoreReflectionFactory.makeNamedType(CoreReflectionFactory.java:114)
at sun.reflect.generics.visitor.Reifier.visitClassTypeSignature(Reifier.java:125)
at sun.reflect.generics.tree.ClassTypeSignature.accept(ClassTypeSignature.java:49)
at sun.reflect.annotation.AnnotationParser.parseSig(AnnotationParser.java:439)
at sun.reflect.annotation.AnnotationParser.parseClassValue(AnnotationParser.java:420)
at sun.reflect.annotation.AnnotationParser.parseClassArray(AnnotationParser.java:724)
at sun.reflect.annotation.AnnotationParser.parseArray(AnnotationParser.java:531)
at sun.reflect.annotation.AnnotationParser.parseMemberValue(AnnotationParser.java:355)
at sun.reflect.annotation.AnnotationParser.parseAnnotation2(AnnotationParser.java:286)
at sun.reflect.annotation.AnnotationParser.parseAnnotations2(AnnotationParser.java:120)
at sun.reflect.annotation.AnnotationParser.parseAnnotations(AnnotationParser.java:72)
at java.lang.Class.createAnnotationData(Class.java:3513)
at java.lang.Class.annotationData(Class.java:3502)
at java.lang.Class.getAnnotation(Class.java:3407)
at org.testng.internal.annotations.JDK15AnnotationFinder.findAnnotationInSuperClasses(JDK15AnnotationFinder.java:84)
at org.testng.internal.annotations.JDK15AnnotationFinder.findAnnotation(JDK15AnnotationFinder.java:150)
at org.testng.internal.annotations.AnnotationHelper.findTest(AnnotationHelper.java:31)
at org.testng.internal.MethodHelper.isEnabled(MethodHelper.java:189)
at org.testng.internal.Invoker.invokeConfigurations(Invoker.java:184)
at org.testng.internal.Invoker.invokeMethod(Invoker.java:653)
at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:901)
at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1231)
at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:127)
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:111)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
   Caused by: javassist.bytecode.BadBytecode: build ()Lorg/apache/http/impl/client/CloseableHttpClient; in org.apache.http.impl.client.HttpClientBuilder: inconsistent stack height 21
at javassist.bytecode.stackmap.MapMaker.make(MapMaker.java:119)
at javassist.bytecode.MethodInfo.rebuildStackMap(MethodInfo.java:458)
at javassist.bytecode.MethodInfo.rebuildStackMapIf6(MethodInfo.java:440)
at javassist.CtBehavior.insertBefore(CtBehavior.java:800)
... 37 more
Caused by: javassist.bytecode.BadBytecode: inconsistent stack height 21
at javassist.bytecode.stackmap.Tracer.doOpcode(Tracer.java:81)
at javassist.bytecode.stackmap.MapMaker.make(MapMaker.java:195)
at javassist.bytecode.stackmap.MapMaker.make(MapMaker.java:207)
at javassist.bytecode.stackmap.MapMaker.make(MapMaker.java:172)
at javassist.bytecode.stackmap.MapMaker.make(MapMaker.java:116)
... 40 more
Caused by: java.lang.ArrayIndexOutOfBoundsException: 21
at javassist.bytecode.stackmap.Tracer.doASTORE(Tracer.java:422)
at javassist.bytecode.stackmap.Tracer.doOpcode54_95(Tracer.java:299)
at javassist.bytecode.stackmap.Tracer.doOpcode(Tracer.java:75)
... 44 more
1

There are 1 best solutions below

0
On

Even if you're not using Maven, you should try to have consistent versions of your dependencies. You've got 1.6.2, 1.6.4, 1.6.6, 1.7.4 ... you should use the same version for all powermock libraries. The last version of 1.x is 1.7.4, so I'd recommend starting there. Mixing them up is asking for trouble -- a change to the junit4 module might have depended on a lower level change in the core release.

You don't specify which java version you're using, nor httpclient, nor Mockito, so I have to assume there are no compatibility issues there. For example, if you're trying to use Powermock 1.x under Java 11, you're probably going to run into issues.

Beyond that, I'd try updating to the very latest version of Javassist (3.28.0-GA at time of writing), OR you could try the javassist version that powermock 1.7.4 was built against (3.21.0-GA) (but that's not going to help you over the long term).

If updating to the most recent powermock 1.7.4/javassist still gives the same result, then because your error result is a very low-level internal javassist message ("inconsistent stack height"), there's very little that anyone unfamiliar with its internals can do for you. Your next move would probably be to try updating to PowerMock 2 (which might also require updates to Mockito, etc).

You could try posting a bug against powermock 1.x or a message in their google group, but ... Powermock 2 is out for several years now and 1.x is almost certainly no longer supported (hasn't been a new 1.x version for over 3 years), so they'll probably also tell you to try PowerMock 2 first. If you still get the same error after upgrading, then you might have found a bug in powermock/javassist worth fixing, or else an incompatibility that should be documented.