我试图理解为什么带有 android 依赖项的抽象类的具体实例是可单元测试的。考虑下面的类:
import android.arch.lifecycle.Lifecycle;
import android.arch.lifecycle.LifecycleObserver;
import android.arch.lifecycle.LiveData;
import android.arch.lifecycle.Observer;
import android.arch.lifecycle.OnLifecycleEvent;
public abstract class BaseFoo implements LifecycleObserver {
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
public void onResume() {
...
}
@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
public void onCreate() {
...
}
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
public void onDestroy() {
...
}
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
public void onPause() {
...
}
...
}
还有:
public class ConcreteFoo extends BaseFoo {
public void bar() {
...
}
}
测试的基础如下:
import android.arch.lifecycle.Lifecycle;
public abstract class BaseTest {
@Mock protected Lifecycle lifecycle;
...
}
考虑到 android 对每个类的依赖性,为什么可以这样:
@RunWith(MockitoJUnitRunner.class)
public class FooTest extends BaseTest {
@Test
public void testSomething() {
...
}
}
可以对ConcreteFoo
进行单元测试吗?仅仅是因为lifecycle
在BaseTest
中被模拟了吗?如果是这样,如何根据真实设备系统回调来测试它?如何避免此类测试中出现错误? Mockito 是否有一些特殊功能可以实现其他框架可能没有的功能?
最佳答案
“具有 Android 依赖项的类不可测试”似乎具有相当具体的含义。
采取一个经典的 Activity 或 Fragment。通常对 TextView
、LayoutManager
等有很多依赖。几乎不可能在每个依赖项上 stub 行为以执行任何类型的合理单元测试。请注意,依赖项 TextView
等是 android.*
类,它们包含在运行 Android 的设备(即您的手机)的运行时中。
设计不当的 Presenter 和 ViewModel 类也可能存在此问题。例如,如果 Presenter 或 ViewModel 依赖于 Context,那么将很难放入测试工具中,因为 android.*
Context 类很难模拟。
但是,该指令不一定适用于 android.arch.*
类。这些不包含在手机上的 Android 运行时中,其设计方式是为了方便测试。因此,在您给出的示例中,将这些包含在设计用于单元测试的类中似乎没有错误。
关于java - 为什么具有 Android 依赖项的基类实例可以进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51148455/