有没有办法在AsyncTask的抽象类保护方法中对代码进行单元测试?

时间:2017-04-06 12:20:22

标签: android mockito junit4 powermock robolectric

长话短说,我需要测试在" doInBackground"中执行的代码。 AsyncTask的方法。

这在带有PowerMockito / Mockito / Robolectric / JUnit4的Android Studio中。

我知道测试编写的代码远非理想,
 但我在这方面没有任何说法,我无法更改原始代码。

情况就是这样:

   public void methodToTest(){
     new AsyncTask<Integer, Void, Boolean>() { 
        @Override
        protected Boolean doInBackground(Integer... integers) {

           //How to test code written over here ?

           return false;
        }
     }
  }

有没有办法解决这个问题? 任何建议都非常感谢

1 个答案:

答案 0 :(得分:0)

有一个丑陋但在这里绕道而行:反思。

重点是:上面的代码声明了一个匿名的内部类。但事实是:即使是匿名的内部类也有一个唯一的,定义的名称。

使用反射,完全可以实例化这种匿名内部类的对象。

您可以查看here以了解这将如何运作。

归结为:当您能够实例化包含var objMap = { // ===> object with specified keys '&': '&​amp;', // ===> that have to be replaced '<': '&​lt;', // ===> with their corresponding values '>': '&​gt;', '\'': '&​apos;', '"': '\&​quot;' } function convertHTML(str) { var res = str.replace(/[&<>\\"]/g, match => objMap[match]); return res; } console.log(convertHTML("Hamburgers < Pizza < Tacos "));的类的对象时;那么你也可以实例化那个内部类的对象。然后你应该能够在这些对象中的任何一个上调用方法。

但即使这样可以让你进行合理的单元测试:你可能想要向人们展示那些测试的生产代码。为了向他们表明他们不愿意撰写可测试的生产代码会造成什么样的伤害!