(译) MVP 缺失的纽带

#mvp

原文:MVP: The Missing Link
译者:JohnWatsonDev
转载请注明出处 — 有节操工程师必备品质~

我已经想学 Model View Presenter 有一阵了,非常高兴昨晚在 GDG Boulder 上听 Michael Cameron 的讲座。
mvp with View Interface

界面接口

我之前模糊地认为 MVP 有利于单元测试,现在终于知道原因啦。秘密就是缺失的界面接口,它不是 MVP 首字母缩写的一部分。界面接口在 view 层和 presenter 层之间定义了一份约定,它允许你在测试其中之一时模拟另一个。 你能够把安卓 UI 代码划分到 view 层(通常是 FragmentActivity),view 层和 presenter 层可以通过界面接口单独地通信。你可以不写一行安卓代码模拟界面接口,这意味能在 JVM 上使用 JUnit 测试 presenter 层。

通过 build flavors 来模拟

模拟对于封闭测试是必要的,不过大家常常使用依赖注入框架,比如 Dagger。如果你喜欢的话,可以使用 build flavors 提供针对测试的模拟。这是个很好的技巧。
mock via build flavors

Mockito

Mockito 是一个很好的模拟框架而且能通过注解模拟。使用 @Mock 标注你想模拟的成员变量,在标注了 @Before 注解的方法中调用 MockitoAnnotations.initMocks() 完成初始化。

@Mock
private MyThing myThing;

@Mock
private OtherThing otherThing;

@Before
public void setUp() throws Exception {
  MockitoAnnotations.initMocks(this);
}

等价于:

private MyThing myThing;
private OtherThing otherThing;

@Before public void setUp() throws Exception {
  myThing = Mockito.mock(MyThing.class);
  otherThing = Mockito.mock(OtherThing.class);
}

这是我做的 Sketchnotes:
sketch_notes
幻灯片: 原文 译文

代码实验室

Google 已经发布了一个很好的使用 MVP 架构的代码示例 Android Testing Codelab
在示例中你可以看到 JUnit 和 Espresso 测试的作用,通过 build flavors 模拟,还有其他的奇技淫巧。快去看看吧!译文在此

译者注

为何会发现这篇博文?
源于一个 issue 讨论 — Is the MVP architecture better than MVC?
顺便吐槽一下 Google 的效率,在市面上 MVP 流行之后才发布一篇简单的指导文章,当然更多的是在讲 ATSL
搞不懂 Google 为何不早点推出官方的指导框架呢?