多模块项目中使用Mock不生效的问题
最开始我再B模块中写测试类,可以正常Mock,但是后来我希望在测试类中能引入上下文环境,之前引入上下文环境一直使用SpringBootTest引入上下文,现在由于启动类在A模块下面,无法引入启动类,无法加载上下文环境。我想到的解决办法有两个:
(1):在A模块中编写测试类,但是Mock不生效;
(2):在B模块的测试类中引入上下文环境,但是启动类不在B模块下面。
跨模块的Mock使用TestableMock会有些不符合直觉。先说结论:
A模块包含启动类,因此测试需要由A模块发起(应当在A模块编写测试类),同时TestableMock的Mock类是不能跨模块引用的,因此需要把相应的Mock类也写到A模块(即使被Mock的调用发生在B模块里)。
举个例子:
module-a
src
main
com
abc
Main.java
test
com
abc
MainTest.java
def
DependMock.java
module-b
src
main
com
def
Depend.java
在模块A中,测试发起类是com.abc.MainTest,被测的主要类是com.abc.Main,它使用了模块B的com.def.Depend类。在测试时需要对com.def.Depend类中的某些调用进行Mock,此时应当将Mock类com.def.DependMock放到执行测试的模块A里才会生效。
此外跨模块Mock的情况在TestableMock中很容易产生为了放置Mock类而增加的孤立包路径,可以考虑使用包路径映射。
本质来说,虽然TestableMock提供几乎万能的Mock能力,但其最初设定的适用场景主要还是标准的单元测试(每个类有自己的测试类),在跨类跨模块等更偏向集成测试的场景里用起来会相对没那么顺手。
好的,感谢感谢,了解了