簡體   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