如何将Android SingleLaunchActivityTestCase转换为ActivityTestRule? (仪器单元测试)

时间:2018-09-21 12:55:48

标签: android unit-testing junit android-testing android-instrumentation

SingleLaunchActivityTestCase的文档说该类已被弃用,应将其替换为ActivityTestRule。但是,这是怎么做的?

SingleLaunchActivityTestCase允许一个活动启动一次并保持打开状态;然后可以在此期间运行多个测试,然后关闭活动。 ActivityTestRule似乎没有此功能-它总是为每个@Test方法重新启动Activity。

因此可以使ActivityTestRule一次启动一个活动并使其保持打开状态,以及如何确保{{1}中的context(来自activityTestRule.getActivity())不为空。 }}功能?

示例代码here

2 个答案:

答案 0 :(得分:1)

使用constructor that does not start the activity by default(将launchActivity参数设置为false)。然后在您的设置中使用launchActivity(),但不要在每种测试方法中使用。这样,您将自己一次启动它,但是每个测试将在同一实例上运行。

您可能还希望在测试类的末尾明确完成该活动,以进行清理。

注意:尽管这通常不是最佳的测试实践,因为测试可能相互依赖(这不是一个好主意),或者根据运行的顺序提供错误的结果,等等。在这种情况下,状态从一个测试一直保持到下一个测试。

答案 1 :(得分:1)

我用乔恩·亚当斯(Jon Adams)的答案来举例说明:

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

    @Rule
    public ActivityTestRule<MyActivity> activityTestRule =
            new ActivityTestRule<>(MyActivity.class, true, false);

    /**
     * When running the class as a test suite, setUp() is called repeatedly
     * for each test method. Use setupDone to prevent multiple setups.
     */
    private static boolean setupDone;
    // Static to persist across multiple tests
    private static Context context;
    private static MyActivity activityUnderTest;

    @Before
    public void setUp() throws Exception {
        // Launch the Activity manually, once, to get a real Context object.
        if (!setupDone) {
            activityUnderTest = activityTestRule.launchActivity(null);
            context = (Context) activityUnderTest;
            // continue setup of singletons...
            setupDone = true;
        }
    }

    @Test
    public void test1() {
        // Use context ...
    }

    @Test
    public void test2() {
       // Use activityUnderTest ...
    }

    @AfterClass
    public static void cleanUp() throws Exception {
        if (activityUnderTest != null) {
            activityUnderTest.finish();
            // Prevent any potential memory leaks
            activityUnderTest = null;
            context = null;
            setupDone = false;
        }
    }
}

当测试作为类或单独运行时,其工作方式类似于SingleLaunchActivityTestCase。