我正在尝试使用Travis CI,并让它通过测试来查看codecov上的结果。
.travis.yml:
language: android
sudo: required
jdk: oraclejdk8
before_cache:
- rm -f $HOME/.gradle/caches/modules-2/modules-2.lock
- rm -fr $HOME/.gradle/caches/*/plugin-resolution/
cache:
directories:
- $HOME/.gradle/caches/
- $HOME/.gradle/wrapper/
env:
global:
- ANDROID_API=25
- EMULATOR_API=21
- ANDROID_BUILD_TOOLS=25.0.0
- ADB_INSTALL_TIMEOUT=5 # minutes
android:
components:
- tools
- platform-tools
- build-tools-$ANDROID_BUILD_TOOLS
- android-$ANDROID_API
- android-$EMULATOR_API_LEVEL
- extra-google-m2repository
- extra-android-m2repository # for design library
- addon-google_apis-google-19 # google play services
- sys-img-armeabi-v7a-addon-google_apis-google-$ANDROID_API_LEVEL
- sys-img-armeabi-v7a-addon-google_apis-google-$EMULATOR_API_LEVEL
licenses:
- android-sdk-preview-license-.+
- android-sdk-license-.+
- google-gdk-license-.+
before_install:
- mkdir "$ANDROID_HOME/licenses" || true
- echo -e "\n8933bad161af4178b1185d1a37fbf41ea5269c55" > "$ANDROID_HOME/licenses/android-sdk-license"
- echo -e "\n84831b9409646a918e30573bab4c9c91346d8abd" > "$ANDROID_HOME/licenses/android-sdk-preview-license"
- chmod +x gradlew
#- ./gradlew dependencies || true # DON'T ADD unless you are getting "Install missing components using SDK manager"
#Source: https://medium.com/@oldergod/constraint-layout-and-circleci-travis-d50342696d2
script:
- ./gradlew build jacocoTestReport assembleAndroidTest
- echo no | android create avd --force -n test -t android-21 --abi armeabi-v7a
- emulator -avd test -no-skin -no-audio -no-window &
- android-wait-for-emulator
- adb shell setprop dalvik.vm.dexopt-flags v=n,o=v
- ./gradlew connectedCheck
after_success:
- bash <(curl -s https://codecov.io/bash)build.gradle:
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.2.2'
classpath 'com.dicedmelon.gradle:jacoco-android:0.1.1'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}Build.gradle(应用程序):
apply plugin: 'com.android.application'
apply plugin: 'jacoco-android'
android {
compileSdkVersion 24
buildToolsVersion "24.0.3"
defaultConfig {
applicationId "<ID>"
minSdkVersion 15
targetSdkVersion 24
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
vectorDrawables.useSupportLibrary = true
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
debug {
testCoverageEnabled true
}
}
testOptions {
unitTests.returnDefaultValues = true
}
lintOptions {
abortOnError false
}
productFlavors {
free {}
paid {}
}
packagingOptions {
exclude 'META-INF/DEPENDENCIES'
exclude 'META-INF/NOTICE'
exclude 'META-INF/LICENSE'
exclude 'META-INF/LICENSE.txt'
exclude 'META-INF/NOTICE.txt'
}
}
dependencies {
compile files('libs/httpclient-4.5.1.jar')
compile fileTree(include: ['*.jar'], dir: 'libs')
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:24.2.1'
compile 'com.android.support:support-v4:24.2.1'
compile 'com.android.support:design:24.2.1'
compile 'com.android.support:support-vector-drawable:24.2.1'
testCompile 'junit:junit:4.12'
compile files('libs/themoviedbapi-4.3.jar')
compile files('libs/api-common-2.0.jar')
compile files('libs/commons-codec-1.9.jar')
compile files('libs/commons-lang3-3.4.jar')
compile files('libs/httpcore-4.4.3.jar')
compile files('libs/jackson-annotations-2.7.1.jar')
compile files('libs/jackson-core-2.7.1.jar')
compile files('libs/jackson-databind-2.7.1.jar')
compile files('libs/slf4j-api-1.7.16.jar')
}我们尝试运行的测试是一个仪表化测试。Travis日志上的输出如下所示:
com.example.fabian.tinf15b4_lsmf.SeeMovieDetailsTest > seeMovieDetails[test(AVD) - 5.0.2] [31mFAILED [0m
java.lang.NoSuchMethodError: No virtual method releaseConnection()V in class Lorg/apache/http/client/methods/HttpRequestBase; or its super classes (declaration of 'org.apache.http.client.methods.HttpRequestBase' appears in /system/framework/ext.jar)
at org.yamj.api.common.http.DigestedResponseReader.processRequest(DigestedResponseReader.java:119)
Tests on test(AVD) - 5.0.2 failed: Instrumentation run failed due to 'java.lang.NoSuchMethodError'
:app:connectedFreeDebugAndroidTest FAILED此外,还有自动生成的测试,它只是简单地将两个数字相加并检查结果,但Travis甚至没有通过它。
有没有人能帮我解决这个烂摊子?
发布于 2017-05-28 20:04:57
阅读this related question关于HTTPClient - NoSuchMethodError for .releaseConnection的内容。
HttpRequestBase#releaseConnection()方法是在4.2 version中明确添加的。
也许你有jar地狱。如果编译器没有编译错误,则可以在运行时加载类的另一个版本。真正的原因取决于您的构建工具。如果你使用的是maven/gradle,可能会有一些传递依赖。
所以实际上HttpRequestBase#releaseConnection()方法只是对AbstractExecutionAwareRequest#reset()代理调用。而AbstractExecutionAwareRequest#reset()只是取消方法的执行。也许这不是你所需要的。
执行和释放httpClient资源的正确方法是关闭httpResponse,这意味着您可以在httpClient的内部threadPool中释放线程。
private static String makeRequest(HttpUriRequest httpRequest) throws IOException {
CloseableHttpResponse httpResponse = httpClient.execute(httpRequest);
try {
HttpEntity httpEntity = httpResponse.getEntity();
StringWriter writer = new StringWriter();
IOUtils.copy(httpEntity.getContent(), writer, "UTF-8");
return writer.toString();
} finally {
httpResponse.close();
}
}在quickstart中,您将看到不再使用.releaseConnection() (它已被弃用),而是关闭
对象以确保关闭连接。
尝试不同的httpclient或httpcore版本(来自here):
看起来您有一个包含旧/新版本BasicHttpContext的jar文件。如果有直接冲突,你会收到一个ClassNotFoundException。ClassLoaders对于这类事情通常都是笨蛋。在这种情况下,类exists没有编译另一个库(我相信是httpclient调用上下文)所针对的方法。
对于23+接口,也可以在您的/app/build.gradle like this中添加the removed apache library
android {
compileSdkVersion 24
buildToolsVersion "24.0.3"
useLibrary 'org.apache.http.legacy'
...
}ApacheAndroid6.0版本删除了对
HTTP客户端的支持。如果您的应用程序正在使用此客户端,并且目标是Android2.3(API9级)或更高版本,请改用HttpURLConnection类。此API效率更高...
this article和this sample似乎对配置Android和Travis-ci的编解码器很有用:
生成检测测试代码覆盖率报告的
需要对构建脚本进行较小的更改。
android {
buildTypes {
debug {
testCoverageEnabled true
}
}
}为了避免通过覆盖率报告忽略我们的测试,我们需要配置以下设置:
android {
testOptions {
unitTests.all {
jacoco {
includeNoLocationClasses = true
}
}
}
}接下来,我们需要配置报告输出:
jacocoAndroidUnitTestReport {
csv.enabled false
html.enabled true
xml.enabled true
}https://stackoverflow.com/questions/43941946
复制相似问题