我一直在研究MVC/MPV/MVVM的优缺点,发现一个共同的主题就是MVC比MVP和MVVM更难进行单元测试,但我并不完全理解为什么。
根据我的理解,在MVC中,视图依赖于模型和控制器,因此为了测试视图,必须对控制器和模型进行模拟。而MVP/MVVM如何改进这一点呢?
我一直在研究MVC/MPV/MVVM的优缺点,发现一个共同的主题就是MVC比MVP和MVVM更难进行单元测试,但我并不完全理解为什么。
根据我的理解,在MVC中,视图依赖于模型和控制器,因此为了测试视图,必须对控制器和模型进行模拟。而MVP/MVVM如何改进这一点呢?
MVVM
比MVP
和MVC
更适合实现单元测试,因为你可以为ViewModel
和Model
层编写测试用例,而无需引用View并模拟它的对象。
MVP
也是一种好的架构模式,但与MVVM
相比,其缺点是你需要在Presenter层引用View,因此你需要在Presenter单元测试中解决View引用的问题。
MVC
的测试几乎与MVP
相似,但其主要问题是不仅在Controller
层可以访问View
,而且在View
中也可以访问Model
层,这使得你的测试更加困难。
总的来说,只要你的代码是松耦合的,编写单元测试就会更容易,而MVVM架构在很大程度上提供了这种松耦合。
MVC中,没有单独的组件来处理UI或者表示层逻辑。大部分时间里,这部分代码会被写在View层(例如Activity)中。在编写单元测试时,你需要依赖像Robolectric这样的框架,它可以理解Android生态系统。这使得对表示层逻辑进行单元测试变得更加困难。而MVP和MVVM两个模式则专注于通过接口和事件驱动模式将Android依赖性解耦,从而简化单元测试。这篇博客更加详细地解释了这一点。