Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

org.testng.TestNGException while trying to access PoolingHttpClientConnectionManager

So I have recently started facing TestNGException while trying to run our existing test suite using the IDE. By recently I mean updating the intelliJ and dependencies to try working on latest versions. The code and the stack-trace for failure is as follows -

Code Usage

ITests.java -

public class ITests extends BaseTest {
    private final Action action = new Action();
}

BaseTest (just to share the syntax)-

public class BaseTest {
    // where in this class does not use any instance of Http
}

Action.java -

public class Action {
    private final Http http = Http.getInstance();
}

Http.java -

public class Http {

    private static final Http INSTANCE = new Http(); //line 36

    public static Http getInstance() {
        return INSTANCE;
    }

    private Http() {
        PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(); //line 43
        connectionManager.setMaxTotal(100);
        connectionManager.setDefaultMaxPerRoute(100);
        RequestConfig defaultRequestConfig = RequestConfig.custom()
                .setSocketTimeout(60000)
                .setConnectTimeout(60000)
                .setConnectionRequestTimeout(60000)
                .build();
        this.client = HttpClients.custom().setDefaultRequestConfig(defaultRequestConfig)
                .setConnectionManager(connectionManager).build();
    }
}

Maven Dependency -

<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.5.2</version>
</dependency>

StackTrace -

org.testng.TestNGException: 
Cannot instantiate class com.package.tests.test.ITests
  at org.testng.internal.ObjectFactoryImpl.newInstance(ObjectFactoryImpl.java:40)
  at org.testng.internal.ClassHelper.createInstance1(ClassHelper.java:382)
  at org.testng.internal.ClassHelper.createInstance(ClassHelper.java:295)
  at org.testng.internal.ClassImpl.getDefaultInstance(ClassImpl.java:118)
  at org.testng.internal.ClassImpl.getInstances(ClassImpl.java:183)
  at org.testng.internal.TestNGClassFinder.<init>(TestNGClassFinder.java:128)
  at org.testng.TestRunner.initMethods(TestRunner.java:416)
  at org.testng.TestRunner.init(TestRunner.java:242)
  at org.testng.TestRunner.init(TestRunner.java:212)
  at org.testng.TestRunner.<init>(TestRunner.java:159)
  at org.testng.SuiteRunner$DefaultTestRunnerFactory.newTestRunner(SuiteRunner.java:549)
  at org.testng.SuiteRunner.init(SuiteRunner.java:161)
  at org.testng.SuiteRunner.<init>(SuiteRunner.java:114)
  at org.testng.TestNG.createSuiteRunner(TestNG.java:1290)
  at org.testng.TestNG.createSuiteRunners(TestNG.java:1277)
  at org.testng.TestNG.runSuitesLocally(TestNG.java:1131)
  at org.testng.TestNG.run(TestNG.java:1048)
  at org.testng.IDEARemoteTestNG.run(IDEARemoteTestNG.java:72)
  at org.testng.RemoteTestNGStarter.main(RemoteTestNGStarter.java:122)
Caused by: java.lang.reflect.InvocationTargetException
  at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
  at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
  at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
  at java.lang.reflect.Constructor.newInstance(Constructor.java:422)
  at org.testng.internal.ObjectFactoryImpl.newInstance(ObjectFactoryImpl.java:29)
  ... 18 more
Caused by: java.lang.NoSuchMethodError: org.apache.http.impl.conn.CPool.setValidateAfterInactivity(I)V
  at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.<init>(PoolingHttpClientConnectionManager.java:176)
  at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.<init>(PoolingHttpClientConnectionManager.java:158)
  at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.<init>(PoolingHttpClientConnectionManager.java:149)
  at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.<init>(PoolingHttpClientConnectionManager.java:125)
  at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.<init>(PoolingHttpClientConnectionManager.java:116)
  at com.package.core.Http.<init>(Http.java:43)
  at com.package.core.Http.<clinit>(Http.java:36)
  at com.package.tests.action.Action.<init>(Action.java:16)
  at com.package.tests.test.ITests.<init>(ITests.java:24)
  ... 23 more

Note - Our project is base on maven, so while I execute the tests using maven exec:java the execution goes fine.

Please do ask for any other info required.

Edit 1 -

As asked by @hunter, debugging to get the exact path of Cpool from where it loaded. Evaluated -

Class.forName("org.apache.http.impl.conn.CPool").getResource‌​("CPool.class")

Result -

file:/Users/xyz/.m2/repository/org/apache/httpcomponents/httpclient/4.5.2/httpclient-4.5.2.jar!/org/apache/http/impl/conn/CPool.class

Edit 2 -

mvn dependency:tree [most related to httpcomponents] -

--- maven-dependency-plugin:2.8:tree

com.package:core:jar:1.1.3

+- org.apache.httpcomponents:httpclient:jar:4.5.2:compile |  +- org.apache.httpcomponents:httpcore:jar:4.4.4:compile |  +- commons-logging:commons-logging:jar:1.2:compile |  \- commons-codec:commons-codec:jar:1.9:compile
+- com.google.collections:google-collections:jar:1.0:compile
+- commons-io:commons-io:jar:2.5:compile
+- org.apache.commons:commons-lang3:jar:3.4:compile
+- org.json:json:jar:20160810:compile \- org.testng:testng:jar:6.9.9:compile

com.package:test:jar:1.1.3

+- mysql:mysql-connector-java:jar:6.0.3:compile
+- org.apache.httpcomponents:httpclient:jar:4.5.2:compile |  +- org.apache.httpcomponents:httpcore:jar:4.4.4:compile |  +- commons-logging:commons-logging:jar:1.2:compile |  \- commons-codec:commons-codec:jar:1.9:compile
+- com.package:mobile:jar:3.6.2:compile |  +- com.pkg.serviceproxy:http-handler:jar:1.7.41:compile |  |  +- org.apache.httpcomponents:httpcore-nio:jar:4.3:compile |  +- com.pkg:bullseye-model:jar:1.2.0:compile |  |  +- com.codahale.metrics:metrics-httpclient:jar:3.0.2:compile |  +- kpg:pz-api:jar:0.2.38:compile |  |  \- com.mashape.unirest:unirest-java:jar:1.4.7:compile |  |     +- org.apache.httpcomponents:httpasyncclient:jar:4.0.2:compile |  |     \- org.apache.httpcomponents:httpmime:jar:4.3.6:compile
+- com.package:core:jar:1.1.3:compile

com.package:driver:jar:1.1.3

\- com.package:test:jar:1.1.3:compile

Edit 3 - intelliJ IDEA - 15.0.3 [Community] - updated on 19th Jan,2016

Edit 4 -

Bending more towards intelliJ, sharing the logs post running the tests using testng.xml -> right click -> run

> objc[21590]: Class JavaLaunchHelper is implemented in both
> /Library/Java/JavaVirtualMachines/jdk1.8.0_65.jdk/Contents/Home/bin/java
> and
> /Library/Java/JavaVirtualMachines/jdk1.8.0_65.jdk/Contents/Home/jre/lib/libinstrument.dylib.
> One of the two will be used. Which one is undefined.
> [AppClassLoader@14dad5dc] error can't determine annotations of missing
> type javax.cache.annotation.CachePut when weaving type
> com.intellij.rt.execution.application.AppMain when weaving classes 
> when weaving   [Xlint:cantFindType] [AppClassLoader@14dad5dc] error
> can't determine annotations of missing type
> javax.cache.annotation.CacheResult when weaving type
> com.intellij.rt.execution.application.AppMain when weaving classes 
> when weaving   [Xlint:cantFindType] [AppClassLoader@14dad5dc] error
> can't determine annotations of missing type
> javax.cache.annotation.CacheRemove when weaving type
> com.intellij.rt.execution.application.AppMain when weaving classes 
> when weaving   [Xlint:cantFindType] [AppClassLoader@14dad5dc] error
> can't determine annotations of missing type
> javax.cache.annotation.CacheRemoveAll when weaving type
> com.intellij.rt.execution.application.AppMain when weaving classes 
> when weaving   [Xlint:cantFindType]
like image 644
Naman Avatar asked Sep 02 '16 10:09

Naman


1 Answers

In IDEA, Maven project tab, click on the Show dependencies button (it will show a diagram) , then press Ctrl+ F in that diagram and type httpcore and check the version. if it shows the version less than 4.4 , you can analyze how dependencies has been resolved. Based on that you can adjust the pom to rectify the dependencies. Since it is working with mvn in the command line, this might be a incorrect behavior of the that IDEA resolve maven dependencies through its maven plugin.

like image 86
hunter Avatar answered Oct 13 '22 17:10

hunter