抽象父类中调用mapper时如何mock
增删改查太多,把常用的处理逻辑写在了抽象父类。 场景是这样,AServiceImpl实现了AService接口,继承了AbstractService抽象类,AServiceImpl部分方法直接super调用。 AbstractService通过AServiceImpl重写的getMapper方法获得相应mapper的引用,然后调用mapper的相关方法。 我在测试AServiceImpl相关方法的时候,尝试mock mapper的相关方法,但是不起作用,而且日志里也没有打印抽象类内部的调用链路。请问是我的操作有问题吗?
如果对mapper中的方法的 调用 是发生在AServiceImpl类里的,那么直接在AServiceImplTest.Mock类型里定义与目标调用相同前面的Mock方法应该会生效。
但如果实际 调用 的代码是写在抽象父类AbstractService中的,这种场景属于TestableMock支持得不太好的一种情况,就是被Mock的逻辑不在被测类里,此时需要额外创建一个与父类AbstractService绑定的Mock类型AbstractServiceMock,放在测试目录与AbstractService类相同的包路径下面,然后在AbstractServiceMock里定义相应的Mock方法。
如果对mapper中的方法的 调用 是发生在
AServiceImpl类里的,那么直接在AServiceImplTest.Mock类型里定义与目标调用相同前面的Mock方法应该会生效。但如果实际 调用 的代码是写在抽象父类
AbstractService中的,这种场景属于TestableMock支持得不太好的一种情况,就是被Mock的逻辑不在被测类里,此时需要额外创建一个与父类AbstractService绑定的Mock类型AbstractServiceMock,放在测试目录与AbstractService类相同的包路径下面,然后在AbstractServiceMock里定义相应的Mock方法。
好的,多谢回复。如果后续TestableMock能支持这种内部调用的场景那真是极好的。
我遇到需要mock 泛型出入参的抽象父类方法的情况(类似RedisTemplate<K, V>),通过创建AbstractServiceMock也不好处理。 最后反向在子类中添加了需要mock的方法的具体实现(内容为直接return super.***();),然后只需要mock这个子类的方法就可以了。