SingleLaunchActivityTestCase
的文档说该类已被弃用,应将其替换为ActivityTestRule
。但是,这是怎么做的?
SingleLaunchActivityTestCase
允许一个活动启动一次并保持打开状态;然后可以在此期间运行多个测试,然后关闭活动。 ActivityTestRule
似乎没有此功能-它总是为每个@Test方法重新启动Activity。
因此可以使ActivityTestRule
一次启动一个活动并使其保持打开状态,以及如何确保{{1}中的context
(来自activityTestRule.getActivity()
)不为空。 }}功能?
示例代码here。
答案 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。