我需要在Android应用程序中测试一个 Activity 。 ActivityInstrumentationTestCase2的文档说:



并且ActivityTestRule的文档中说:



几乎相同的词。除了我已编码的两个样本外,请执行相同的操作。因此,我应该选择ActivityTestRule而不是ActivityInstrumentationTestCase2还是反之?

我看到的是,扩展ActivityInstrumentationTestCase2看起来像一个JUnit3样式的测试(其祖先是junit.framework.TestCase,并且测试方法应以test开头)。

使用ActivityTestRule

package sample.com.sample_project_2;

import android.support.test.rule.ActivityTestRule;
import android.support.test.runner.AndroidJUnit4;
import android.test.suitebuilder.annotation.LargeTest;

import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;

import static android.support.test.espresso.Espresso.onView;
import static android.support.test.espresso.action.ViewActions.typeText;
import static android.support.test.espresso.matcher.ViewMatchers.withId;

@RunWith(AndroidJUnit4.class)
@LargeTest
public class ApplicationTest {

    @Rule
    public ActivityTestRule<SecAct> mActivityRule = new ActivityTestRule(SecAct.class);

    @Test
    public void foo() {
        onView(withId(R.id.editTextUserInput)).perform(typeText("SAMPLE"));

    }
}

扩展ActivityInstrumentationTestCase2
package sample.com.sample_project_2;

import android.test.ActivityInstrumentationTestCase2;

import static android.support.test.espresso.Espresso.onView;
import static android.support.test.espresso.action.ViewActions.typeText;
import static android.support.test.espresso.matcher.ViewMatchers.withId;


public class ApplicationTest2 extends ActivityInstrumentationTestCase2<SecAct> {

    public ApplicationTest2() {
        super(SecAct.class);
    }

    @Override
    protected void setUp() throws Exception {
        super.setUp();
        getActivity();
    }


    public void testFoo2() {
        onView(withId(R.id.editTextUserInput)).perform(typeText("SAMPLE 2"));

    }
}

最佳答案

对于您的示例,没有区别。您可以使用其中任何一个。

按照面向对象的原则,我们将“优先考虑组成而不是继承”。 ActivityTestRule<>的用法是通过合成,而ActivityInstrumentationTestCase2<>则是继承。

有时,我更愿意为我的测试类提供一个通用基类,以重用通用初始化。这有助于我根据主题对测试进行分组。 ActivityTestRule<>允许我执行此类操作。

由于这些原因,我更喜欢ActivityTestRule<>。否则,我没有看到任何区别。

10-05 18:48