我有一个应用程序,我正在为它编写单元测试用例。
我的测试用例给出了一个巨大的警告列表和一个错误
遵循以下链接和子页面构建仪器化单元测试
错误和一些警告
警告:有10个未解析的类或接口引用。您可能需要添加缺失的库jar或更新它们的版本。如果您的代码在没有丢失类的情况下运行良好,则可以进行抑制带有'- donwarn '选项的警告。(http://proguard.sourceforge.net/manual/troubleshooting.html # unresolvedclass)警告:根据程序类有5个库类实例。您必须避免这种依赖关系,因为程序类会这样做被处理,而库类将保持不变。(http://proguard.sourceforge.net/manual/troubleshooting.html依赖)警告:有3个未解析的程序类成员引用。您的输入类似乎不一致。您可能需要重新编译代码。(http://proguard.sourceforge.net/manual/troubleshooting.html # unresolvedprogramclassmember)java.io.IOException:请先纠正以上警告。应用:transformClassesAndResourcesWithProguardForDebugAndroidTest失败
错误:执行任务":app:transformClassesAndResourcesWithProguardForDebugAndroidTest"失败。java.io.IOException: Please correct the above warnings .
如果我从调试中删除proguard,我得到64K错误!
错误:.dex文件中的方法引用数不能超过64K。在https://developer.android.com/tools/building/multidex.html
了解如何解决此问题。
我做错了什么?
应用build.gradle
android {
compileSdkVersion 24
buildToolsVersion "23.0.3"
defaultConfig {
applicationId "com.tyagiabhinav.xyz"
minSdkVersion 16
targetSdkVersion 24
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
debug {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies
{
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:24.2.0'
compile 'com.android.support:design:24.2.0'
compile 'com.android.support:support-annotations:24.2.0'
......
androidTestCompile 'com.android.support:support-annotations:24.2.0'
androidTestCompile 'com.android.support.test:runner:0.5'
androidTestCompile 'com.android.support.test:rules:0.5'
}
测试Java类
package com.tyagiabhinav.xyz;
import android.content.Context;
import android.support.test.InstrumentationRegistry;
import android.support.test.runner.AndroidJUnit4;
import com.tyagiabhinav.xyz.Util.PrefHelper;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
/**
* Created by abhinavtyagi on 24/08/16.
*/
@RunWith(AndroidJUnit4.class)
public class PrefTester {
Context mMockContext;
private PrefTester() {
super();
}
@Before
public void setUp() {
mMockContext = InstrumentationRegistry.getTargetContext();
PrefHelper.init(mMockContext);
}
@Test
public void testSharedPref(){
Assert.assertEquals(false,PrefHelper.isLoggedIn());
}
}
您正在调试构建中运行proguard。Proguard可以从java代码中删除类。通过在构建中设置"minifyEnabled false"来关闭proguard。gradle文件
buildTypes {
debug {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
做了一些改变,问题得到了解决!
测试代码/strong>
修改了通过打开闪屏获取上下文的方式
@RunWith(AndroidJUnit4.class)
public class PrefTester {
Context mMockContext;
@Rule
public ActivityTestRule<SplashActivity> mActivityRule = new ActivityTestRule<>(SplashActivity.class);
@Before
public void setUp() {
mMockContext = mActivityRule.getActivity().getApplicationContext();
PrefHelper.init(mMockContext);
}
@Test
public void testSharedPref(){
Assert.assertEquals(false,PrefHelper.isLoggedIn());
}
}
build.gradle (app)
在调试中设置proguard false -> minifyEnabled false
启用multidex -> multiDexEnabled true
添加依赖项-> compile 'com.android.support:multidex:1.0.1'
我已经测试了构建。gradle方法之前张贴这个问题,我认为我是抓取上下文错误的方式。以上的改变对我来说已经奏效了。
您的proguard-rules中有什么?支持文件?你可以试着删除它,并简单地使用默认的android规则。
作为一个提示,我认为你可能需要重新评估你的依赖关系。从您所展示的gradle文件片段来看,仅使用这些依赖项似乎不太可能达到64K索引限制。你是否包含了更多上面没有列出的库?在您的项目中有jar文件中的库吗?(这很容易解释方法的数量)
Multidex是一种黑客——除非你别无选择,否则你真的不应该使用它。使用它会有性能影响等,并且会意外地出现一些奇怪的问题,比如哪些类存在于哪个索引文件中。例如,从清单中引用的任何类都必须在主索引文件中结束,这可能会给您带来奇怪的约束。