如何使用 ActivityInstrumentationTestCase2 捕获异常?
How to catch exceptions using ActivityInstrumentationTestCase2?
我正在努力使用 class ActivityInstrumentationTestCase2.
在我的 Android 应用程序的测试用例中捕获预期异常
我写了一个非常简单的场景来提出这个问题,一旦这个问题解决了,我可能可以对我的应用程序做同样的事情。下面是简单场景的片段。
首先,有一个我要测试的应用程序,它在其 onCreate 方法中引发了 NullPointerException。
package com.example.crashtest;
import android.app.Activity;
import android.os.Bundle;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
String s = null;
s.trim(); // NullPointerException raised here!
setContentView(R.layout.activity_player);
}
}
然后,我的 ActivityInstrumentationTestCase2 class 运行此测试:
package com.my.test;
import android.test.ActivityInstrumentationTestCase2;
import com.example.crashtest.MainActivity;
public class MyClassTest extends ActivityInstrumentationTestCase2<MainActivity>{
public MyClassTest() throws ClassNotFoundException {
super(MainActivity.class);
}
@Override
protected void setUp() throws Exception {
//setUp() is run before a test case is started.
super.setUp();
try {
getActivity(); // This calls MainActivity.onCreate().
} catch (Exception e) {
// Never gets here =(
}
}
public void test() throws Exception {
}
}
如果我删除对 s.trim()
的调用,那么我没有任何问题,但我希望能够捕获在执行测试时可能发现的任何异常。
当我执行上面的代码时,我收到以下消息:
Test failed to run to completion. Reason: 'Instrumentation
run failed due to 'java.lang.NullPointerException''. Check device logcat for details
我怎样才能覆盖这种行为?
我在 2013 年发现了一个非常相似的问题 here,但也没有得到回答。
测试引擎(在您的例子中是 ActivityInstrumentationTestCase2)就像一个沙箱。由您的代码引起的异常将永远不会通过 throw e
;
离开沙箱
错误处理和错误转发不是 ActivityInstrumentationTestCase2
的任务。每个错误都会导致测试因失败而终止。你会得到一些关于原因的描述:
Test failed to run to completion. Reason: 'Instrumentation run failed
due to 'java.lang.NullPointerException''. Check device logcat for
details
所以我相信,不幸的是没有(合法的)方法来捕获测试引擎抛出的异常,处理它并恢复测试。
你可以这样做:
try{
String s = null;
s.trim(); // NullPointerException raised here!
}catch(Error err){
//override your behaviour here
throw err;
}
我正在努力使用 class ActivityInstrumentationTestCase2.
在我的 Android 应用程序的测试用例中捕获预期异常我写了一个非常简单的场景来提出这个问题,一旦这个问题解决了,我可能可以对我的应用程序做同样的事情。下面是简单场景的片段。
首先,有一个我要测试的应用程序,它在其 onCreate 方法中引发了 NullPointerException。
package com.example.crashtest;
import android.app.Activity;
import android.os.Bundle;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
String s = null;
s.trim(); // NullPointerException raised here!
setContentView(R.layout.activity_player);
}
}
然后,我的 ActivityInstrumentationTestCase2 class 运行此测试:
package com.my.test;
import android.test.ActivityInstrumentationTestCase2;
import com.example.crashtest.MainActivity;
public class MyClassTest extends ActivityInstrumentationTestCase2<MainActivity>{
public MyClassTest() throws ClassNotFoundException {
super(MainActivity.class);
}
@Override
protected void setUp() throws Exception {
//setUp() is run before a test case is started.
super.setUp();
try {
getActivity(); // This calls MainActivity.onCreate().
} catch (Exception e) {
// Never gets here =(
}
}
public void test() throws Exception {
}
}
如果我删除对 s.trim()
的调用,那么我没有任何问题,但我希望能够捕获在执行测试时可能发现的任何异常。
当我执行上面的代码时,我收到以下消息:
Test failed to run to completion. Reason: 'Instrumentation
run failed due to 'java.lang.NullPointerException''. Check device logcat for details
我怎样才能覆盖这种行为?
我在 2013 年发现了一个非常相似的问题 here,但也没有得到回答。
测试引擎(在您的例子中是 ActivityInstrumentationTestCase2)就像一个沙箱。由您的代码引起的异常将永远不会通过 throw e
;
错误处理和错误转发不是 ActivityInstrumentationTestCase2
的任务。每个错误都会导致测试因失败而终止。你会得到一些关于原因的描述:
Test failed to run to completion. Reason: 'Instrumentation run failed due to 'java.lang.NullPointerException''. Check device logcat for details
所以我相信,不幸的是没有(合法的)方法来捕获测试引擎抛出的异常,处理它并恢复测试。
你可以这样做:
try{
String s = null;
s.trim(); // NullPointerException raised here!
}catch(Error err){
//override your behaviour here
throw err;
}