代码之家  ›  专栏  ›  技术社区  ›  winwaed

如何为我的浓缩咖啡活动测试提供自定义应用程序类?

  •  1
  • winwaed  · 技术社区  · 6 年前

    我对浓缩咖啡还不太熟悉,但我试着测试一个相对简单的活动。我的android应用程序有自己的自定义应用程序类。我怎样才能告诉Espresso使用这个类的模拟(或自定义)版本?

    这是我的自定义应用程序版本。它创建一些测试数据(为简洁起见,在此处编辑)。接下来,我还将重写一些方法。

    public class MockMyApplication extends MyApplication {
    
    @Override
    public void onCreate() {
        super.onCreate();
    
        // create some location data for testing
        DataRecord rec = new DataRecord(1);
        rec.setName("TestLoc1");
        rec.setDescription("an important customer");
        MyData.add(rec);
     }
    }
    

    我试着用这个测试,看起来是这样的:

    @RunWith(AndroidJUnit4.class)
    @LargeTest
    public class LocEditActivityTest extends AndroidJUnitRunner {
    
    @Rule
    public ActivityTestRule<LocEditActivity> activityTestRule
            = new ActivityTestRule<>(LocEditActivity.class);
    
    
    @Override
    public Application newApplication(ClassLoader cl, String className, Context context) throws IllegalAccessException, ClassNotFoundException, InstantiationException {
        return super.newApplication(cl, MockMyApplication.class.getName(), context);
    }
    
    
    @Test
    public void testActivity_ExistingLoc() {
    
        Intent i = new Intent();
        i.putExtra("loc",1);
        activityTestRule.launchActivity(i);
    
        onView(withId(R.id.editName)).check(matches(withText("TestLoc1")));
    
    
        // shutdown
        onView(withContentDescription("Navigate up")).perform(click());
    
     }
    }
    

    使用调试器,我确定当loceditacivity的onCreate调用getApplication()时,它返回一个MyApplication类,其中包含空数据,而不是MockedMyApplication和我的测试数据。

    1 回复  |  直到 6 年前
        1
  •  4
  •   winwaed    6 年前

    找到了!

    看来我误解了“Runner”类的用法。我需要创造我自己的跑步者来延长AndroidJUnitRunner:

    import android.app.Application;
    import android.content.Context;
    import android.support.test.runner.AndroidJUnitRunner;
    
    
    // Our own test runniner - uses MockMyApplication as a mocked app class
    public class MyAndroidTestRunner extends AndroidJUnitRunner {
    
        @Override
        public Application newApplication(ClassLoader cl, String className, Context context) throws IllegalAccessException, ClassNotFoundException, InstantiationException {
            return super.newApplication(cl, MockMyApplication.class.getName(), context);
        }
    
    }
    

    然后在build.gradle(app)中,testInstrumentRunner条目需要指向新的runner:

            testInstrumentationRunner "com.winwaed.xyzapp.MyAndroidTestRunner"
    

    由于newApplication重写位于错误的位置,应该从我的测试类中删除它。此外,测试类不再扩展任何类。(也就是说,我基本上把跑步者和测试类分开了——正如我所说,我误解了跑步者类)