有没有办法在 AsyncTask 的抽象 class 保护方法中对代码进行单元测试?
Is there a way to unit-test code in abstract class protected method of AsyncTask?
长话短说,我需要测试在 AsyncTask 的 "doInBackground" 方法中执行的代码。
这在 Android Studio 中,带有 PowerMockito / Mockito / Robolectric / JUnit4。
我知道测试编写的代码远非理想,
但我对此一无所知,我无法更改原始代码。
情况是这样的:
public void methodToTest(){
new AsyncTask<Integer, Void, Boolean>() {
@Override
protected Boolean doInBackground(Integer... integers) {
//How to test code written over here ?
return false;
}
}
}
有办法解决吗?
非常感谢任何建议
有一个丑陋但在这里绕行:反射。
重点是:上面的代码声明了一个匿名内部class。但事实是:即使是匿名内部 classes 也有一个唯一的、定义好的名称。
并且使用反射,完全可以实例化这种匿名内部 classes 的对象。
您可以查看 以了解其工作原理。
归结为:当您能够实例化包含 methodToTest()
的 class 的对象时;那么您还可以实例化该内部 class 的对象。然后您应该能够在这些对象中的任何一个上调用方法。
但即使这有效并让您进行合理的单元测试:您可能希望向编写生产代码的人员展示这些测试。让他们清楚他们不愿意编写可测试生产代码会造成什么样的伤害!
长话短说,我需要测试在 AsyncTask 的 "doInBackground" 方法中执行的代码。
这在 Android Studio 中,带有 PowerMockito / Mockito / Robolectric / JUnit4。
我知道测试编写的代码远非理想,
但我对此一无所知,我无法更改原始代码。
情况是这样的:
public void methodToTest(){
new AsyncTask<Integer, Void, Boolean>() {
@Override
protected Boolean doInBackground(Integer... integers) {
//How to test code written over here ?
return false;
}
}
}
有办法解决吗? 非常感谢任何建议
有一个丑陋但在这里绕行:反射。
重点是:上面的代码声明了一个匿名内部class。但事实是:即使是匿名内部 classes 也有一个唯一的、定义好的名称。
并且使用反射,完全可以实例化这种匿名内部 classes 的对象。
您可以查看
归结为:当您能够实例化包含 methodToTest()
的 class 的对象时;那么您还可以实例化该内部 class 的对象。然后您应该能够在这些对象中的任何一个上调用方法。
但即使这有效并让您进行合理的单元测试:您可能希望向编写生产代码的人员展示这些测试。让他们清楚他们不愿意编写可测试生产代码会造成什么样的伤害!