java - 为什么具有 Android 依赖项的基类实例可以进行单元测试?

标签 java unit-testing mocking mockito android-lifecycle

我试图理解为什么带有 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进行单元测试吗?仅仅是因为lifecycleBaseTest中被模拟了吗?如果是这样,如何根据真实设备系统回调来测试它?如何避免此类测试中出现错误? Mockito 是否有一些特殊功能可以实现其他框架可能没有的功能?

最佳答案

“具有 Android 依赖项的类不可测试”似乎具有相当具体的含义。

采取一个经典的 Activity 或 Fragment。通常对 TextViewLayoutManager 等有很多依赖。几乎不可能在每个依赖项上 stub 行为以执行任何类型的合理单元测试。请注意,依赖项 TextView 等是 android.* 类,它们包含在运行 Android 的设备(即您的手机)的运行时中。

设计不当的 Presenter 和 ViewModel 类也可能存在此问题。例如,如果 Presenter 或 ViewModel 依赖于 Context,那么将很难放入测试工具中,因为 android.* Context 类很难模拟。

但是,该指令不一定适用于 android.arch.* 类。这些不包含在手机上的 Android 运行时中,其设计方式是为了方便测试。因此,在您给出的示例中,将这些包含在设计用于单元测试的类中似乎没有错误。

关于java - 为什么具有 Android 依赖项的基类实例可以进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51148455/

相关文章:

java - 为什么 JPanel 只重绘一次?

java - 搜索翻译的id时应该返回null还是-1?

java - 使用 @PostConstruct 模拟类会导致初始化失败

c++ - 伪造/模拟非虚拟 C++ 方法

c# - 存在依赖时如何设计可模拟性?

c# - 在 ASP MVC 中测试 Controller

java - 从action类访问jsp页面中class的值

java - 在应用程序开始时获取 HttpSessionEventPublisher 异常

c++ - 您如何在测试 gmock 下模拟属于该类的函数?

python - 是否可以使用 pytest 测试 while True 循环(我尝试超时)?