我需要在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<>
。否则,我没有看到任何区别。