【问题标题】:Unit testing a method which is inside an Android Activity对 Android Activity 中的方法进行单元测试
【发布时间】:2017-09-27 04:32:11
【问题描述】:

我不知道是否已回答,我发现了一些类似的问题,但答案对我来说没有任何意义。所以,我再问一遍。

我们如何测试 Activity 中的方法。

public class MyActivity extends AppCompatActivity {
   @Override
   protected void onCreate(Bundle savedInstanceState) {
       //inflate layout        
   }

   public int someMethod() {
       //perform some logic and return an integer
   }

}

我想对方法someMethod 进行单元测试,但我该怎么做,因为我无法创建活动的实例并直接调用该方法。被测方法不使用任何 android 组件,因此我不想使用 Roboelectric 或任何其他此类库或工具。这是一个普通的java方法。

我知道的一种方法是将方法移动到另一个类并对该类进行单元测试,我对此非常满意,但我想知道这是否是正确的方法,(为此目的创建一个单独的类),或者有其他方法吗?

感谢您的任何反馈。

【问题讨论】:

  • 有了你不想使用 Roboelectric、Espresso 等的约束,那么你需要将它从 Activity 中重构出来。
  • 那么绝对没有办法做到这一点,而不必创建一个不同的类?
  • 运行活动的 Espresso 活动规则。然后你就可以在上面调用函数了。

标签: java android unit-testing


【解决方案1】:

稍微深入一点,您不想在另一个类中测试单个方法。 跟随 S.O.L.I.D.和 D.R.Y.原则上,您的班级应承担单一责任。 所以如果你认为你只想测试一个方法,那么这个方法显然比类的其他部分有另一个的责任。这导致我们:它不应该在那个特定的类中。

单元测试仅与测试背后的计划一样好(并且有价值)。

回答您的问题:是的,您可以拨打new myActivitiy() 并且单元测试可能会运行它(至少我认为是这样)。但是,如果该方法使用运行时值/上下文或该活动中的任何其他内容,则必须运行 Espresso 或类似框架。

我建议创建一个可测试的适当对象模型。

单元测试只能测试编写的代码可测试

干杯,格里斯

【讨论】:

  • 感谢您富有洞察力的回复,但请帮助我理解这一点,我使用的方法对严格属于此类的变量进行操作。例如,假设该类有一个字符串列表,我想从该列表中选择一个特定的字符串,我应该在哪里编写该函数?
  • 你在函数中思考,而不是在课堂中思考。你用过Adapter吗?像 ArrayAdapter、CursorAdapter 等?基本上,这些也只是“列表管理”类,它们有它们的生命周期方法、绑定视图、检索项目等。所以从面向对象的角度来看,你的活动中没有 List,你有一个一种 ListManager 类,用于保存列表、检索、添加、删除项目并为您管理列表。然后这个类是可单元测试的。您的活动只需调用 listManager.get(...)。并且完全没有任何限制,也没有任何单元测试
  • 哦,现在很有意义,谢谢你这么详细的解释。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-31
  • 2011-07-08
  • 2021-07-29
  • 2012-06-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多