【发布时间】:2016-07-14 01:53:32
【问题描述】:
这是我正在测试的活动。 我希望我可以用另一种方式写它,因为我听说使用 thread.sleep 很危险。但我不允许这样做。
以下是这段代码的作用:调用 onCreate 时,MainActivity 暂停几秒钟,然后触发 Activity2
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
goToAct2();
}
};
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(3000);
handler.sendEmptyMessage(0);
} catch (InterruptedException e) {}
}
}).start();
}
private void goToAct2(){
Intent i = new Intent (this,Activity2.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(i);
finish();
}
}
我想测试 MainActivity 是否调用了正确的 Activity(即 Activity2)。下面是单元测试代码:
public class MainActivityTest extends
ActivityInstrumentationTestCase2<MainActivity>
{
MainActivity activity;
public MainActivityTest()
{
super(MainActivity.class);
}
protected void setUp() throws Exception
{
super.setUp();
activity=getActivity();
}
@UiThreadTest
public void testOne()
{
ActivityMonitor Act2Monitor = getInstrumentation().addMonitor(Activity2.class.getName(), null, false);
getInstrumentation().callActivityOnCreate(activity, null);;
assertEquals(1, Act2Monitor.getHits());
}
}
我注意到:
-
如果我丢弃处理程序线程部分:
在onCreate()中直接调用goToAct2(),测试还是失败。但是,如果我在该方法中删除 finish(),则测试通过。
-
如果我保留处理程序线程部分:
无论我做什么,测试总是失败,即使实际活动按预期工作。
幕后发生了什么?还有,如何正确编写可以确认 Activity2 创建的测试?
【问题讨论】:
-
你不应该在
assertEquals()之前等待3秒吗? -
也试过了。测试仍然没有通过。
-
删除了
finish()并尝试等待?您可能需要等待 3 秒多一点。大概 4 秒。 -
也试过了。我等了 10 秒,而不是 3 或 4 秒。不允许删除 finish()。
标签: java android multithreading unit-testing