在Android Activity中单元测试一个方法

5

我不知道是否已经有人回答过这个问题,我找到了一些类似的问题,但是答案对我来说没有任何意义。所以,我再次提出这个问题。

我们如何测试一个在活动中的方法。

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方法。
我知道的一种方法是将该方法移动到另一个类中,并对该类进行单元测试,我对此完全满意,但我想知道是否这是正确的方法(为此目的创建单独的类),或者是否有其他方法可以做到这一点?
感谢任何反馈。

1
如果您不想使用Roboelectric、Espresso等工具,那么您需要将其从Activity中重构出来。 - Gabe Sechan
那么,难道没有其他方法可以做到这一点,而不必创建一个不同的类吗? - Ezio
一个Espresso Activity规则,用于运行该活动。然后您可以在其上调用函数。 - Gabe Sechan
1个回答

6
一些理论方面的内容,你不应该在另一个类中测试单个方法。遵循S.O.L.I.D和D.R.Y原则,你的类应该只有单一的职责。因此,如果你认为你只想测试单个方法,那么这个方法显然有比其他类更多的职责。这会导致:它不应该在那个特定的类中。
单元测试的好坏(以及价值)完全取决于测试计划的质量。
回答您的问题:是的,您可以调用 new myActivitiy() ,并且单元测试可能运行它(至少我认为是这样)。但是,如果该方法使用运行时值/上下文或来自该活动的任何其他东西,则无法做到这一点,除非运行Espresso或类似框架。
我建议创建一个适合进行测试的适当对象模型。
单元测试只能测试可测试的代码。
问候,Gris

谢谢您的深入回答,但请帮我理解一下,我正在使用的方法是针对严格属于该类的变量进行操作。例如,假设该类有一个字符串列表,我想从该列表中选择特定的字符串,那么我应该在哪里编写该函数? - Ezio
4
你更多的是以函数为思考方式,而不是以类为基础。你使用过“Adapter”吗?比如ArrayAdapter、CursorAdapter等等?实际上,它们也只是“列表管理”类,具有它们自己的生命周期方法、绑定视图、检索项目等等。所以从面向对象的角度来看,你的activity里不是有一个List<string>,而是一种名为ListManager的类,用于保存列表、检索、添加、移除项目并为你管理列表。然后这个类就可以进行单元测试了。你的activity只需调用listManager.get(...),并且完全没有任何限制,不需要在activity中进行单元测试。 - Grisgram
哦,现在我明白了,非常感谢您提供如此详细的解释。 - Ezio

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接