繁体   English   中英

仪器化的Android单元测试和ProGuard

[英]Instrumented Android Unit Test and ProGuard

我有一个应用程序,正在为此编写单元测试用例。
我的测试用例给出了大量警告和1个错误的列表
关注以下链接和子页面构建仪器测试

错误和一些警告

警告:有10个未解决的对类或接口的引用。 您可能需要添加缺少的库jar或更新其版本。 如果您的代码可以正常运行而没有缺少类,则可以使用“ -dontwarn”选项禁止显示警告。 http://proguard.sourceforge.net/manual/troubleshooting.html#unresolvedclass )警告:根据程序类,有5个库类实例。 您必须避免此类依赖性,因为将处理程序类,而库类将保持不变。 http://proguard.sourceforge.net/manual/troubleshooting.html#dependency )警告:有3个未解析的对程序类成员的引用。 您的输入类似乎不一致。 您可能需要重新编译代码。 http://proguard.sourceforge.net/manual/troubleshooting.html#unresolvedprogramclassmember )警告:处理任务java.io.IOException时发生异常:请首先更正以上警告。 :app:transformClassesAndResourcesWithProguardForDebugAndroidTest失败

错误:任务':app:transformClassesAndResourcesWithProguardForDebugAndroidTest'的执行失败。 java.io.IOException:请首先更正以上警告。

如果从调试中删除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代码中删除类。 通过在build.gradle文件中设置“ minifyEnabled false”来关闭proguard

buildTypes {
    debug {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'),   'proguard-rules.pro'
    }

进行了少量更改,问题得到解决!

测试代码
通过打开启动画面更改了获取上下文的方式

@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(应用程序)
在调试中将proguard设置为minifyEnabled false > minifyEnabled false
已启用multidex-> multiDexEnabled true
添加了依赖项-> compile 'com.android.support:multidex:1.0.1'

在发布此问题之前,我已经测试过build.gradle方法,我认为我以错误的方式获取了上下文。 以上更改的组合现在对我有用。

您的proguard-rules.pro文件中有什么? 您可以尝试删除它,而只需使用默认的android规则。

需要注意的是,我认为您可能需要重新评估依赖关系。 从显示的gradle文件的片段中,似乎仅凭这些依赖关系就不可能达到64K dex限制。 您是否包括了上面未列出的更多库? 项目中的jar文件中是否有库? (这可以很容易地解释方法的数量)

Multidex有点像黑客-除非别无选择,否则您真的不应该使用它。 完全使用它会对性能产生影响,等等,并且有些奇怪的陷阱可能会意外地提示哪些类存在于哪个dex文件中。 例如,清单中引用的任何类都必须以您的主dex文件结尾,这会给您带来怪异的约束。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM