0

我正在用Espresso做黑盒測試。我遵循另一個線程的指導(Android Espresso how to write tests using apk?)。但是我的測試在DexPathList上找不到類。該錯誤信息是:Blackbox Espresso測試在路徑上找不到類

產生的原因:拋出java.lang.ClassNotFoundException:找不到類 「com.twitter.android.DispatchActivity」 的路徑:DexPathList [zip文件「/系統/框架/機器人。 test.runner.jar「,zip文件」/data/app/...test-2.apk「,zip文件」/data/app/...-2.apk"],nativeLibraryDirectories=[/data/app -lib/.... test-2,/data/app-lib/...-2,/ vendor/lib,/ system/lib]]

我正在測試的應用程序是Twitter和I沒有源代碼。所以我在Android Studio中創建了一個Android項目。

清單文件看起來像:

<manifest 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    package="my.test"> 

    <application 
     android:allowBackup="true" 
     android:label="@string/app_name" 
     android:icon="@mipmap/ic_launcher" 
     android:theme="@style/AppTheme"> 

    </application> 

    <instrumentation 
     android:name="android.test.InstrumentationTestRunner" 
     android:targetPackage="com.twitter.android"> 
    </instrumentation> 
</manifest> 

測試類:

@RunWith(AndroidJUnit4.class) 
public class Replayer { 
    private static final String CLASSNAME = "com.twitter.android.DispatchActivity"; 

    private static Class<? extends Activity> activityClass; 
    static { 
     try { 
      activityClass = (Class<? extends Activity>) Class.forName(CLASSNAME); 
     } catch (ClassNotFoundException e) { 
      throw new RuntimeException(e); 
     } 
    } 

    @Rule 
    public final ActivityTestRule<?> activityRule 
      = new ActivityTestRule<>(activityClass); 

    @Test 
    public void launchMain() { 
     Espresso.onView(ViewMatchers.withText("Log in")).perform(ViewActions.click()); 
    } 
} 

我沒有看到DexPathList目標應用程序。我錯誤配置了我的項目嗎?

回答

0

嗯,我以後近一個月的時間想通了探索......目標應用程序需要的build.gradle文件中指定,像這樣:

android { 
    .... 
    defaultConfig { 
     ... 
     applicationId "com.twitter.android" 
    } 
    ... 
} 

的gradle這個會自動生成儀器節點中Android清單文件。請注意,在清單中手動添加android:targetPackage將不起作用。

+0

根據[DSL參考](http://google.github.io/android-gradle-dsl/current/com.android.build.gradle.internal.dsl.ProductFlavor.html#com.android.build .gradle.internal.dsl.ProductFlavor:testApplicationId),'testApplicationId'的意思是「測試應用程序ID」,並且與被測應用程序的軟件包名稱無關。 –

+0

另外,[用戶指南](http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Testing)說:''targetPackage''屬性的值'即使通過「defaultConfig」和/或Build Type對象自定義,測試應用程序清單中的instrumentation節點也會自動填充測試應用程序的軟件包名稱。這是清單的這部分自動生成的原因之一。 –

+0

@JeremyKao非常感謝您指出。它實際上是一個錯字,它應該是applicationId而不是testApplicatoinId。 – Halo