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

时间:2018-07-03 07:04:49

标签: 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中是否有一些特殊的功能可以使其他框架实现这一功能?

1 个答案:

答案 0 :(得分:1)

“具有Android依赖关系的类不可测试”似乎具有特定含义。

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

设计欠佳的Presenter和ViewModel类也会出现此问题。例如,如果Presenter或ViewModel依赖于Context,则由于难以模拟android.* Context类,因此很难放入测试工具中。

但是,此伪指令不一定适用于android.arch.*类。这些内容未包含在手机的Android运行时中,其设计旨在促进测试。因此,在您给出的示例中,将这些包含在旨在进行单元测试的类中似乎没有错。