java - 尝试访问 PoolingHttpClientConnectionManager 时出现 org.testng.TestNGException

标签 java intellij-idea testng apache-httpclient-4.x pooling

所以我最近在尝试使用 IDE 运行我们现有的测试套件时开始面临 TestNGException。最近我的意思是更新 intelliJ 和依赖项以尝试在最新版本上工作。失败的代码和堆栈跟踪如下 -

代码使用

ITests.java -

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

BaseTest(只是为了共享语法)-

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>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.5.2</version>
</dependency>

堆栈跟踪 -

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

注意 - 我们的项目基于 maven,因此当我使用 maven exec:java 执行测试时,执行正常。

请务必询问任何其他所需信息。

编辑 1 -

正如@hunter 所要求的,调试以从加载位置获取 Cpool 的确切路径。评估 -

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

结果 -

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

编辑 2 -

mvn dependency:tree [与 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

编辑 3 - intelliJ IDEA - 15.0.3 [社区] - 2016 年 1 月 19 日更新

编辑 4 -

更多地倾向于 intelliJ,使用 testng.xml -> 右键单击​​ -> 运行 共享运行测试后的日志

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

最佳答案

在 IDEA 中,Maven 项目选项卡,点击Show dependencies 按钮(它会显示一个图表),然后按 Ctrl+ F该图并键入 httpcore 并检查版本。如果显示版本小于 4.4 ,你可以分析依赖是如何解决的。在此基础上,您可以调整 pom 以纠正依赖关系。由于它在命令行中使用 mvn,这可能是 IDEA 通过其 maven 插件解析 maven 依赖项的不正确行为。

关于java - 尝试访问 PoolingHttpClientConnectionManager 时出现 org.testng.TestNGException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39289935/

相关文章:

java - 阻塞锁与非阻塞锁

intellij-idea - HTML 文件中的 IntelliJ 代码完成对某些标记过于激进

java - 我在我的 Mac 上安装了 java 6 和 java 8,我使用的是哪一个?

java - 是否有用于测试 RESTful API 的 Java 包?

java - 在 Testng 中使用数据提供程序和并行,如何在给定测试的同一线程中运行方法之前、方法之后和测试。

java - 将int文字传递给在java中采用整数的方法

java - AsyncTask 非常慢

java - 本地文件在更新后还能保存吗? (LibGDX)

Intellij IDEA 中的 Maven 导入在大型项目中内存不足

java - 如何针对不同的值多次运行测试方法