为什么具有 Android 依赖关系的基础 class 实例是可单元测试的?
Why are instances of a base class with Android dependencies unit testable?
我试图理解为什么具有 android 依赖关系的抽象 class 的具体实例是可单元测试的。考虑以下 class:
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 对每个 class 的依赖性,为什么可以:
@RunWith(MockitoJUnitRunner.class)
public class FooTest extends BaseTest {
@Test
public void testSomething() {
...
}
}
可针对 ConcreteFoo
进行单元测试?仅仅是因为 lifecycle
在 BaseTest
中被嘲笑了吗?如果是这样,如何根据真实设备系统回调对其进行真正的测试?如何避免在此类测试中出错? Mockito 中是否有一些特殊的东西允许其他框架可能没有的东西?
"Classes with Android dependencies are not testable" 好像有很具体的意思。
拍摄 classic Activity 或片段。通常有很多对 TextView
、LayoutManager
等的依赖。几乎不可能在每个依赖项上存根一个行为来执行任何类型的合理单元测试。请注意,依赖项 TextView
等 android.*
class 包含在设备运行时 运行 Android 中(即,您的 phone).
设计不当的 Presenter 和 ViewModel classes 也会有这个问题。例如,如果 Presenter 或 ViewModel 依赖于上下文,那么将很难放入测试工具中,因为 android.*
上下文 class 很难模拟。
但是,此指令不一定适用于 android.arch.*
classes。这些不包含在 phone 上的 Android 运行时中,其设计旨在促进测试。因此,在您给出的示例中,将这些包含在旨在进行单元测试的 class 中似乎没有错。
我试图理解为什么具有 android 依赖关系的抽象 class 的具体实例是可单元测试的。考虑以下 class:
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 对每个 class 的依赖性,为什么可以:
@RunWith(MockitoJUnitRunner.class)
public class FooTest extends BaseTest {
@Test
public void testSomething() {
...
}
}
可针对 ConcreteFoo
进行单元测试?仅仅是因为 lifecycle
在 BaseTest
中被嘲笑了吗?如果是这样,如何根据真实设备系统回调对其进行真正的测试?如何避免在此类测试中出错? Mockito 中是否有一些特殊的东西允许其他框架可能没有的东西?
"Classes with Android dependencies are not testable" 好像有很具体的意思。
拍摄 classic Activity 或片段。通常有很多对 TextView
、LayoutManager
等的依赖。几乎不可能在每个依赖项上存根一个行为来执行任何类型的合理单元测试。请注意,依赖项 TextView
等 android.*
class 包含在设备运行时 运行 Android 中(即,您的 phone).
设计不当的 Presenter 和 ViewModel classes 也会有这个问题。例如,如果 Presenter 或 ViewModel 依赖于上下文,那么将很难放入测试工具中,因为 android.*
上下文 class 很难模拟。
但是,此指令不一定适用于 android.arch.*
classes。这些不包含在 phone 上的 Android 运行时中,其设计旨在促进测试。因此,在您给出的示例中,将这些包含在旨在进行单元测试的 class 中似乎没有错。