Android 当您在应用程序代码中尝试捕获时,Robolectric测试中出现错误

Android 当您在应用程序代码中尝试捕获时,Robolectric测试中出现错误,android,testing,try-catch,robolectric,Android,Testing,Try Catch,Robolectric,在我的android应用程序中,我在每个事件方法中都编写了try-catch。因此,当异常发生时,catch会获取异常,并且一个方法会显示一个包含异常详细信息的消息框,我可以处理并找到我的应用程序的bug 例如: @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); try { } catch (Exception e) { Message

在我的android应用程序中,我在每个事件方法中都编写了
try-catch
。因此,当异常发生时,catch会获取异常,并且一个方法会显示一个包含异常详细信息的消息框,我可以处理并找到我的应用程序的bug

例如:

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
try {

} 
catch (Exception e) {
        MessageBox.showException(this, e);
    }

}
((MyApplication)getApplication()).getMessageBox().showException(this,e)
现在在Robolectric中,没有显示ui结果的设备,我无法确定是否发生了异常。现在我想在我的代码转到catch part或调用
MessageBox.showException
时执行一些操作,测试失败


我该怎么做呢?

解决这个问题的唯一方法是将处理错误的组件注入到使用它的类中,然后为测试加载一个自定义的组件

有几种方法可以实现这一点,其中一些可能比我建议的更好,但我将尝试并提出一个选项,该选项需要对我认为是您当前的体系结构进行最小的更改

1-无论您使用什么来显示异常,都要在应用程序类中实例化它并将其保留在那里。或者至少从您的应用程序类中提供它,因此现在无论何时需要使用
MessageBox
,而不是静态方法,您都可以首先从
应用程序
中获取它。例如:

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
try {

} 
catch (Exception e) {
        MessageBox.showException(this, e);
    }

}
((MyApplication)getApplication()).getMessageBox().showException(this,e)
2-创建一个
TestMessageBox
和一个
TestApplication
(扩展您的普通应用程序类)。在
TestApplication
中,重写
getMessageBox()
以返回
TestMessageBox
而不是正常的
MessageBox
。在您的
TestMessageBox
中,执行任何您想要的操作,以便能够观察测试中的错误

3-在测试中,使用TestApplication。当您运行测试时,Robolectric将加载它而不是普通的应用程序,因此您的测试现在将使用
TestMessageBox
,您可以捕获所需的信息

@Config(application = TestApplication.class)