Mockery 有三种 partial mock: runtime, generated and proxy。Generated 在 runtime 之前实现的,通过生成代码替换原类的方式,mock掉指定的方法(method)。是目前不推荐的方式,因为:
- 不够灵活,需要提供构造函数参数,这常常造成不必要的麻烦,需要进一步mock掉构造函数中的逻辑,也非常脆弱,如果任意细节发生变动
- 因为要替换掉原类,考虑到 Test Suit一起运行,需要使用 @runTestsInSeparateProcesses 来标记,拖慢了运行速度
文档中没有提及一点:Runtime Partial Mock也可以指定构造函数参数:
$mock = \Mockery::mock('MyClass', [$arg1, $arg2])->makePartial();
这其实是标准 mock 功能,所以作者没有在文档中体现。所以没有必要使用 Generated partial mock。