【问题标题】:Is there a way to unit-test code in abstract class protected method of AsyncTask?有没有办法在 AsyncTask 的抽象类保护方法中对代码进行单元测试?
【发布时间】:2017-04-06 12:20:22
【问题描述】:

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

这在带有 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;
        }
     }
  }

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

【问题讨论】:

  • @EugenMartynov 我在谷歌搜索期间没有遇到那个。如果我是正确的,那是关于验证 AsyncTask 本身?我的目标是测试 AsyncTask 的 doInBackground 方法中使用的代码。如果我错了,请纠正我。
  • 啊,我错过了你想测试抽象类。如果需要,您始终可以在测试中扩展它并以虚拟方式实现抽象方法

标签: android mockito junit4 powermock robolectric


【解决方案1】:

这里有一个但工作的弯路:反射。

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

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

您可以查看here 以了解其工作原理。

归结为:当您能够实例化包含methodToTest() 的类的对象时;那么您也可以实例化该内部类的对象。然后您应该能够在这些对象中的任何一个上调用方法。

但即使这样可行并且可以让您进行合理的单元测试:您可能希望向编写生产代码的人员展示这些测试。让他们清楚地知道他们不愿意编写可测试生产代码会造成什么样的伤害!

【讨论】:

  • 非常感谢您的详细解答。我肯定会讨论这个问题,因为这个案子很糟糕。但与此同时,我将查看提供的示例,看看它是否有效!
猜你喜欢
  • 1970-01-01
  • 2010-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-21
  • 1970-01-01
  • 2015-02-26
相关资源
最近更新 更多