【问题标题】:Can I extend a custom Application in Espresso?我可以在 Espresso 中扩展自定义应用程序吗?
【发布时间】:2015-06-27 07:30:44
【问题描述】:

我正在尝试在我的 Espresso 仪器测试中设置 Dagger,以模拟对外部资源的调用(在本例中为 RESTful 服务)。我在 Robolectric 中为我的单元测试遵循的模式是扩展我的生产应用程序类并使用将返回模拟的测试模块覆盖 Dagger 模块。我在这里尝试做同样的事情,但是当我尝试将应用程序转换为我的自定义应用程序时,我在我的 Espresso 测试中得到了 ClassCastException。

这是我到目前为止的设置:

生产

在 app/src/main/java/com/mypackage/injection 下我有:

MyCustomApplication

package com.mypackage.injection;

import android.app.Application;

import java.util.ArrayList;
import java.util.List;

import dagger.ObjectGraph;

public class MyCustomApplication extends Application {

    protected ObjectGraph graph;

    @Override
    public void onCreate() {
        super.onCreate();

        graph = ObjectGraph.create(getModules().toArray());
    }

    protected List<Object> getModules() {
        List<Object> modules = new ArrayList<Object>();
        modules.add(new AndroidModule(this));
        modules.add(new RemoteResourcesModule(this));
        modules.add(new MyCustomModule());

        return modules;
    }

    public void inject(Object object) {
        graph.inject(object);
    }
}

我以下列方式使用它:

基础活动

package com.mypackage.injection.views;

import android.app.Activity;
import android.os.Bundle;

import com.mypackage.injection.MyCustomApplication;

public abstract class MyCustomBaseActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        ((MyCustomApplication)getApplication()).inject(this);
    }

}

正在测试的活动

package com.mypackage.views.mydomain;
// imports snipped for bevity

public class MyActivity extends MyBaseActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //snip
    }
}

浓缩咖啡设置

在 app/src/androidTest/java/com/mypackage/injection 我有:

MyCustomEspressoApplication

package com.mypackage.injection;

import java.util.ArrayList;
import java.util.List;

import dagger.ObjectGraph;

public class MyCustomEspressoApplication extends MyCustomApplication {

    private AndroidModule androidModule;
    private MyCustomModule myCustomModule;
    private EspressoRemoteResourcesModule espressoRemoteResourcesModule;

    @Override
    public void onCreate() {
        super.onCreate();

        graph = ObjectGraph.create(getModules().toArray());
    }

    protected List<Object> getModules() {
        List<Object> modules = new ArrayList<Object>();
        modules.add(getAndroidModule());
        modules.add(getEspressoRemoteResourcesModule());
        modules.add(getMyCustomModule());

        return modules;
    }

    public void inject(Object object) {
        graph.inject(object);
    }

    public AndroidModule getAndroidModule() {
        if (this.androidModule == null) {
            this.androidModule = new AndroidModule(this);
        }

        return this.androidModule;
    }

    public MyCustomModule getMyCustomModule() {
        if (this.myCustomModule == null) {
            this.myCustomModule = new MyCustomModule();
        }

        return this.myCustomModule;
    }

    public EspressoRemoteResourcesModule getEspressoRemoteResourcesModule() {
        if (this.espressoRemoteResourcesModule == null) {
            this.espressoRemoteResourcesModule = new EspressoRemoteResourcesModule();
        }

        return this.espressoRemoteResourcesModule;
    }
}

我的 Espresso 测试,在 app/src/androidTest/com/mypackage/espresso 下:

package com.mypackage.espresso;

// imports snipped for brevity

@RunWith(AndroidJUnit4.class)
@LargeTest
public class MyActivityTest extends   ActivityInstrumentationTestCase2<MyActivity>{

    private MyActivity myActivity;

    public MyActivityTest() {
        super(MyActivity.class);
    }

    @Before
    public void setUp() throws Exception {
        super.setUp();
        injectInstrumentation(InstrumentationRegistry.getInstrumentation());
        myActivity = getActivity();
    }

    @After
    public void tearDown() throws Exception {
        super.tearDown();
    }

     @Test
     public void testWhenTheActionBarButtonIsPressedThenThePlacesAreListed() {
         //The next line is where the runtime exception occurs.
         MyCustomEspressoApplication app = (MyCustomEspressoApplication)getInstrumentation().getTargetContext().getApplicationContext();
        //I've also tried getActivity().getApplication() and 
        // getActivity.getApplicationContext() with the same results
        //snip
     }
}

我的 AndroidManifest.xml

(我之前在自定义应用程序类中看到过很多关于 ClassCastException 的答案,其中大多数都指向应用程序节点上缺少的“android:name”属性。我将其粘贴到此处以表明这是据我所知,情况并非如此。)

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.mypackage">   
    <!-- snip --> 
    <application
        android:name=".injection.MyCustomApplication"
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
    <!-- snip -->
    </application>
<!-- snip -->
</manifest>

build.gradle

buildscript {
    repositories {
        mavenCentral()
        jcenter()
    }
}

apply plugin: 'com.android.application'
apply plugin: 'idea'

android {
    testOptions {
        unitTests.returnDefaultValues = true
    }
    lintOptions {
        abortOnError false
    }
   packagingOptions {
        exclude 'LICENSE.txt'
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/LICENSE.txt'
        exclude 'META-INF/NOTICE'
    }
    compileSdkVersion 21
    buildToolsVersion "21.1.2"

    defaultConfig {
        applicationId "com.mypackage"
        minSdkVersion 15
        targetSdkVersion 21
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
}

idea {
    module {
        testOutputDir = file('build/test-classes/debug')
    }
}

dependencies {
    compile project(':swipeablecardview')

    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:support-annotations:21.0.3'
    compile 'com.android.support:appcompat-v7:21.0.3'
    compile 'com.squareup:javawriter:2.5.0'
    compile ('com.squareup.dagger:dagger:1.2.2') {
        exclude module: 'javawriter'
    }
    compile ('com.squareup.dagger:dagger-compiler:1.2.2') {
        exclude module: 'javawriter'
    }
    compile 'com.melnykov:floatingactionbutton:1.1.0'
    compile 'com.android.support:cardview-v7:21.0.+'
    compile 'com.android.support:recyclerview-v7:21.0.+'
    //    compile 'se.walkercrou:google-places-api-java:2.1.0'
    compile 'org.apache.httpcomponents:httpclient-android:4.3.5.1'
    compile 'commons-io:commons-io:1.3.2'
    testCompile 'org.hamcrest:hamcrest-integration:1.3'
    testCompile 'org.hamcrest:hamcrest-core:1.3'
    testCompile 'org.hamcrest:hamcrest-library:1.3'
    testCompile('junit:junit:4.12')
    testCompile 'org.mockito:mockito-core:1.+'
    testCompile('org.robolectric:robolectric:3.0-SNAPSHOT')
    testCompile('org.robolectric:shadows-support-v4:3.0-SNAPSHOT')
    androidTestCompile 'org.mockito:mockito-core:1.+'
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.0') {
        exclude group: 'javax.inject'
        exclude module: 'javawriter'
    }
    androidTestCompile('com.android.support.test:testing-support-lib:0.1')
}

堆栈跟踪:

java.lang.ClassCastException: com.mypackage.injection.MyCustomApplication 无法转换为 com.mypackage.injection.MyCustomEspressoApplication 在 com.mypackage.espresso.MyActivityTest.testWhenTheActionBarButtonIsPressedThenThePlacesAreListed(MyActivityTest.java:107) 在 java.lang.reflect.Method.invokeNative(Native Method) 在 java.lang.reflect.Method.invoke(Method.java:511) 在 org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45) 在 org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) 在 org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42) 在 org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20) 在 org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28) 在 org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:30) 在 org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263) 在 org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68) 在 org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47) 在 org.junit.runners.ParentRunner$3.run(ParentRunner.java:231) 在 org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60) 在 org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229) 在 org.junit.runners.ParentRunner.access$000(ParentRunner.java:50) 在 org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222) 在 org.junit.runners.ParentRunner.run(ParentRunner.java:300) 在 org.junit.runners.Suite.runChild(Suite.java:128) 在 org.junit.runners.Suite.runChild(Suite.java:24) 在 org.junit.runners.ParentRunner$3.run(ParentRunner.java:231) 在 org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60) 在 org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229) 在 org.junit.runners.ParentRunner.access$000(ParentRunner.java:50) 在 org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222) 在 org.junit.runners.ParentRunner.run(ParentRunner.java:300) 在 org.junit.runner.JUnitCore.run(JUnitCore.java:157) 在 org.junit.runner.JUnitCore.run(JUnitCore.java:136) 在 android.support.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:270) 在 android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1551)

我已经阅读了 Espresso 和 Dagger 文档,并在 Github 上搜索了问题,但无济于事。任何人都可以提供任何帮助,我将不胜感激。提前致谢。

编辑#1

我按照 Daniel 的建议扩展了测试运行器并检查了 VerifyError,得到了以下堆栈跟踪:

java.lang.ExceptionInInitializerError
            at org.mockito.internal.creation.cglib.ClassImposterizer.createProxyClass(ClassImposterizer.java:95)
            at org.mockito.internal.creation.cglib.ClassImposterizer.imposterise(ClassImposterizer.java:57)
            at org.mockito.internal.creation.cglib.ClassImposterizer.imposterise(ClassImposterizer.java:49)
            at org.mockito.internal.creation.cglib.CglibMockMaker.createMock(CglibMockMaker.java:24)
            at org.mockito.internal.util.MockUtil.createMock(MockUtil.java:33)
            at org.mockito.internal.MockitoCore.mock(MockitoCore.java:59)
            at org.mockito.Mockito.mock(Mockito.java:1285)
            at org.mockito.Mockito.mock(Mockito.java:1163)
            at com.mypackage.injection.EspressoRemoteResourcesModule.<init>(EspressoRemoteResourcesModule.java:17)
            at com.mypackage.injection.MyCustomEspressoApplication.getEspressoRemoteResourcesModule(MyCustomEspressoApplication.java:52)
            at com.mypackage.injection.MyCustomEspressoApplication.getModules(MyCustomEspressoApplication.java:24)
            at com.mypackage.injection.MyCustomApplication.onCreate(MyCustomApplication.java:18)
            at com.mypackage.injection.MyCustomEspressoApplication.onCreate(MyCustomEspressoApplication.java:16)
            at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:999)
            at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4151)
            at android.app.ActivityThread.access$1300(ActivityThread.java:130)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1255)
            at android.os.Handler.dispatchMessage(Handler.java:99)
            at android.os.Looper.loop(Looper.java:137)
            at android.app.ActivityThread.main(ActivityThread.java:4745)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:511)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
            at dalvik.system.NativeStart.main(Native Method)
     Caused by: java.lang.VerifyError: org/mockito/cglib/core/ReflectUtils
            at org.mockito.cglib.core.KeyFactory$Generator.generateClass(KeyFactory.java:167)
            at org.mockito.cglib.core.DefaultGeneratorStrategy.generate(DefaultGeneratorStrategy.java:25)
            at org.mockito.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:217)
            at org.mockito.cglib.core.KeyFactory$Generator.create(KeyFactory.java:145)
            at org.mockito.cglib.core.KeyFactory.create(KeyFactory.java:117)
            at org.mockito.cglib.core.KeyFactory.create(KeyFactory.java:109)
            at org.mockito.cglib.core.KeyFactory.create(KeyFactory.java:105)
            at org.mockito.cglib.proxy.Enhancer.<clinit>(Enhancer.java:70)
            at org.mockito.internal.creation.cglib.ClassImposterizer.createProxyClass(ClassImposterizer.java:95)
            at org.mockito.internal.creation.cglib.ClassImposterizer.imposterise(ClassImposterizer.java:57)
            at org.mockito.internal.creation.cglib.ClassImposterizer.imposterise(ClassImposterizer.java:49)
            at org.mockito.internal.creation.cglib.CglibMockMaker.createMock(CglibMockMaker.java:24)
            at org.mockito.internal.util.MockUtil.createMock(MockUtil.java:33)
            at org.mockito.internal.MockitoCore.mock(MockitoCore.java:59)
            at org.mockito.Mockito.mock(Mockito.java:1285)
            at org.mockito.Mockito.mock(Mockito.java:1163)
            at com.mypackage.injection.EspressoRemoteResourcesModule.<init>(EspressoRemoteResourcesModule.java:17)
            at com.mypackage.injection.MyCustomEspressoApplication.getEspressoRemoteResourcesModule(MyCustomEspressoApplication.java:52)
            at com.mypackage.injection.MyCustomEspressoApplication.getModules(MyCustomEspressoApplication.java:24)
            at com.mypackage.injection.MyCustomApplication.onCreate(MyCustomApplication.java:18)
            at com.mypackage.injection.MyCustomEspressoApplication.onCreate(MyCustomEspressoApplication.java:16)
            at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:999)
            at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4151)
            at android.app.ActivityThread.access$1300(ActivityThread.java:130)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1255)
            at android.os.Handler.dispatchMessage(Handler.java:99)
            at android.os.Looper.loop(Looper.java:137)
            at android.app.ActivityThread.main(ActivityThread.java:4745)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:511)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
            at dalvik.system.NativeStart.main(Native Method)
04-29 06:40:28.594    1016-1016/? W/ActivityManager﹕ Error in app com.mypackage running instrumentation ComponentInfo{com.mypackage.test/com.mypackage.EspressoTestRunner}:
04-29 06:40:28.594    1016-1016/? W/ActivityManager﹕ java.lang.VerifyError
04-29 06:40:28.594    1016-1016/? W/ActivityManager﹕ java.lang.VerifyError: org/mockito/cglib/core/ReflectUtils

这让我想到了 Mockito。我缺少必要的 mockito 和 dexmaker 库。

我将依赖项更新为:

androidTestCompile 'org.mockito:mockito-core:1.10.19'
androidTestCompile 'com.google.dexmaker:dexmaker:1.2'
androidTestCompile ('com.google.dexmaker:dexmaker-mockito:1.2') {
    exclude module: 'hamcrest-core'
    exclude module: 'mockito-core'
}
androidTestCompile('com.android.support.test.espresso:espresso-core:2.0') {
     exclude group: 'javax.inject'
}

我还覆盖了需要包含 EspressoRemoteResourcesModule 的 MyCustomModule。一旦我这样做了,事情就开始工作了。

【问题讨论】:

    标签: android dagger android-espresso


    【解决方案1】:

    使用自定义检测运行程序,您可以覆盖 newApplication 并让它从清单中实例化默认应用程序以外的其他内容。

    public class MyRunner extends AndroidJUnitRunner {
      @Override
      public Application newApplication(ClassLoader cl, String className, Context context)
          throws Exception {
        return super.newApplication(cl, MyCustomEspressoApplication.class.getName(), context);
      }
    }
    

    请务必使用您的自定义跑步者名称更新 testInstrumentationRunner

    【讨论】:

    • 试过这个,现在我得到了:在 nexus_5_android_4_0_3(AVD) - 4.1.1 上的测试失败:由于 'java.lang.VerifyError' 导致仪器运行失败:app:connectedAndroidTest FAILED com.android.builder。 testing.ConnectedDevice > hasTests[nexus_5_android_4_0_3(AVD) - 4.1.1] [31mFAILED [0m 未找到测试。这似乎开辟了新天地。我需要重写另一种方法以使其检测测试吗?
    • 你能粘贴完整的VerifyError(我认为应该在logcat中)和任何dalvikvm警告吗? No tests found 通常意味着在测试开始之前运行器的设置过程中出现错误。
    • 见我上面的编辑。 TL;DR 版本是您通过扩展测试运行程序并检查 VerifyError 为我指明了正确的方向,这将我指向了 Mockito 和 Dexmaker。感谢您的帮助!
    • 这只适用于 androidTest 文件夹,但我使用的 Robolectric 需要在 test 文件夹中。如何同时使用两者?
    【解决方案2】:

    花了我一整天的时间才得到完整的答案。

    第 1 步:覆盖 AndroidJUnitRunner

    public class TestRunner extends AndroidJUnitRunner
    {
        @Override
        public Application newApplication(ClassLoader cl, String className, Context context)
                throws InstantiationException, IllegalAccessException, ClassNotFoundException {
            return super.newApplication(cl, TestApplication.class.getName(), context);
        }
    }
    

    第2步:替换build.gradle中已有的AndroidJunitRunner

    defaultConfig {
        ...
        // testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        testInstrumentationRunner 'com.xi_zz.androidtest.TestRunner'
    }
    

    第 3 步:将 com.android.support.test:runner 添加到 build.gradle

    androidTestCompile 'com.android.support.test:runner:0.5'
    androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.2'
    

    第 4 步:仅当您遇到此错误时

    Warning:Conflict with dependency 'com.android.support:support-annotations'. Resolved versions for app (25.2.0) and test app (23.1.1) differ. See http://g.co/androidstudio/app-test-app-conflict for details.
    

    然后,再添加一行:

    androidTestCompile 'com.android.support:support-annotations:25.2.0'
    androidTestCompile 'com.android.support.test:runner:0.5'
    androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.2'
    

    最后测试一下是否有效

    @RunWith(AndroidJUnit4.class)
    public class MockApplicationTest
    {
        @Rule
        public ActivityTestRule<MainActivity> mActivityRule = new ActivityTestRule<>(MainActivity.class);
    
        @Test
        public void testApplicationName() throws Exception
        {
            assertEquals("TestApplication", mActivityRule.getActivity().getApplication().getClass().getSimpleName());
        }
    }
    

    【讨论】:

    • 你救了我一天!谢谢。我遇到了一个错误“测试运行失败:无法找到仪器信息:ComponentInfo {com.example.myapp.debug.test/android.support.test.runner.AndroidJUnitRunner}”即使我按照您的建议使用了自定义测试运行器.解决方案是删除配置 (android studio -&gt; Run &gt; Edit Configurations &gt; Delete everything under Android Instrumentation Tests)。现在再次运行测试。
    • @rpattabi 我删除了所有内容,但又出现错误 :( 并且所有配置都回来了。Android Studio 出了什么问题!我尝试使用控制台进行操作,但我也从那里得到错误。跨度>
    • 谢谢!我一直在尝试解决这个问题,并且效果很好。 :)
    • 这个答案更详细。谢谢
    • 非常感谢!
    【解决方案3】:

    我没有在所有情况下都广泛尝试过,但是您可以尝试自定义规则来指定每个测试用例的自定义应用程序类,而不是为自定义运行程序应用的所有测试用例。我在简单的情况下取得了以下成功:

    public class ApplicationTestRule<T extends Application> extends UiThreadTestRule {
        Class<T> appClazz;
        boolean wait = false;
        T app;
    
        public ApplicationTestRule(Class<T> applicationClazz) {
            this(applicationClazz, false);
        }
    
        public ApplicationTestRule(Class<T> applicationClazz, boolean wait) {
            this.appClazz = applicationClazz;
            this.wait = wait;
        }
    
        @Override
        public Statement apply(final Statement base, Description description) {
            return new ApplicationStatement(super.apply(base, description));
        }
    
        private void terminateApp() {
            if (app != null) {
                app.onTerminate();
            }
        }
    
        public void createApplication() throws IllegalAccessException, ClassNotFoundException, InstantiationException {
            app = (T) InstrumentationRegistry.getInstrumentation().newApplication(this.getClass().getClassLoader(), appClazz.getName(), InstrumentationRegistry.getInstrumentation().getTargetContext());
            InstrumentationRegistry.getInstrumentation().callApplicationOnCreate(app);
        }
    
        private class ApplicationStatement extends Statement {
    
            private final Statement mBase;
    
            public ApplicationStatement(Statement base) {
                mBase = base;
            }
    
            @Override
            public void evaluate() throws Throwable {
                try {
                    if (!wait) {
                        createApplication();
                    }
                    mBase.evaluate();
                } finally {
                    terminateApp();
                    app = null;
                }
            }
        }
    }
    

    然后在您的测试用例中,创建规则:

    @Rule
    public ApplicationTestRule<TestApplication> appRule = new ApplicationTestRule<>(TestApplication.class,true);
    

    注意第二个参数是可选的。如果为 false 或未设置,则每次在每个测试用例之前创建自定义应用程序。如果设置为 true,则需要在应用程序逻辑之前调用 appRule.createApplication()

    【讨论】:

    • 请注意,这样做会创建应用程序,但不会阻止原始应用程序类首先自行启动。 Daniel 上面的回答替换了实际的检测运行程序,允许您在每次请求应用程序时注入模拟应用程序类,而不仅仅是在单独的测试规则期间。
    【解决方案4】:

    如果您正在测试一个库模块,您可以创建一个自定义应用程序类并将其注册到测试包清单中:

    root/library-module/src/androidTest/AndroidManifest.xml

    <manifest xmlns:android="http://schemas.android.com/apk/res/android">
        <application android:name="path.to.TestApplication" />
    </manifest>
    

    没有规则,没有跑步者。

    【讨论】:

    • 这仅适用于库模块,不适用于应用程序模块吗?因为我尝试了后者,但它根本不起作用。
    • @AutonomousApps 没试过,但是在应用模块中你会想要测试实际的应用,不是吗?
    • 我想要一个实际应用程序的子类用于我的插桩测试,这样我就可以覆盖默认的匕首图。例如,我不想进行真正的 API 调用,或者使用 Fabric/Crashlytics,而是对这些函数进行存根。您的评论令人困惑,因为它质疑原始问题的前提,甚至您自己的答案。如果我们应该始终使用“真正的应用程序”,为什么还要尝试覆盖它,无论是在应用程序还是库模块中?
    【解决方案5】:

    Roboelectric Configuration here 只需单独申请测试即可保存。以下会有所帮助

    @RunWith(AndroidJUnit4::class)
    @Config(application = MockApp::class)
    class RegisTests {
        @Test
        fun hello(){
    
            val acs = ActivityScenario.launch(RegistrationActivity::class.java)
            acs.moveToState(State.CREATED)
            Truth.assertWithMessage("No created").that(State.CREATED).isEqualTo(acs.state)
       
    
     }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-10
      • 1970-01-01
      • 2018-03-04
      • 1970-01-01
      • 2018-02-14
      • 2014-04-09
      相关资源
      最近更新 更多