alibaba / testable-mock

换种思路写Mock,让单元测试更简单
https://alibaba.github.io/testable-mock/
MIT License
1.83k stars 310 forks source link

抽象父类中调用mapper时如何mock #246

Open 1528110566 opened 2 years ago

1528110566 commented 2 years ago

增删改查太多,把常用的处理逻辑写在了抽象父类。 场景是这样,AServiceImpl实现了AService接口,继承了AbstractService抽象类,AServiceImpl部分方法直接super调用。 AbstractService通过AServiceImpl重写的getMapper方法获得相应mapper的引用,然后调用mapper的相关方法。 我在测试AServiceImpl相关方法的时候,尝试mock mapper的相关方法,但是不起作用,而且日志里也没有打印抽象类内部的调用链路。请问是我的操作有问题吗?

linfan commented 2 years ago

如果对mapper中的方法的 调用 是发生在AServiceImpl类里的,那么直接在AServiceImplTest.Mock类型里定义与目标调用相同前面的Mock方法应该会生效。

但如果实际 调用 的代码是写在抽象父类AbstractService中的,这种场景属于TestableMock支持得不太好的一种情况,就是被Mock的逻辑不在被测类里,此时需要额外创建一个与父类AbstractService绑定的Mock类型AbstractServiceMock,放在测试目录与AbstractService类相同的包路径下面,然后在AbstractServiceMock里定义相应的Mock方法。

1528110566 commented 2 years ago

如果对mapper中的方法的 调用 是发生在AServiceImpl类里的,那么直接在AServiceImplTest.Mock类型里定义与目标调用相同前面的Mock方法应该会生效。

但如果实际 调用 的代码是写在抽象父类AbstractService中的,这种场景属于TestableMock支持得不太好的一种情况,就是被Mock的逻辑不在被测类里,此时需要额外创建一个与父类AbstractService绑定的Mock类型AbstractServiceMock,放在测试目录与AbstractService类相同的包路径下面,然后在AbstractServiceMock里定义相应的Mock方法。

好的,多谢回复。如果后续TestableMock能支持这种内部调用的场景那真是极好的。

chwj-yuqiao commented 2 years ago

我遇到需要mock 泛型出入参的抽象父类方法的情况(类似RedisTemplate<K, V>),通过创建AbstractServiceMock也不好处理。 最后反向在子类中添加了需要mock的方法的具体实现(内容为直接return super.***();),然后只需要mock这个子类的方法就可以了。

xuzhuocool commented 5 months ago

我遇到需要mock 泛型出入参的抽象父类方法的情况(类似RedisTemplate<K, V>),通过创建AbstractServiceMock也不好处理。 最后反向在子类中添加了需要mock的方法的具体实现(内容为直接return super.***();),然后只需要mock这个子类的方法就可以了。

改原码了不太好