testable-mock icon indicating copy to clipboard operation
testable-mock copied to clipboard

多模块项目中使用Mock不生效的问题

Open linlai255 opened this issue 3 years ago • 2 comments

最开始我再B模块中写测试类,可以正常Mock,但是后来我希望在测试类中能引入上下文环境,之前引入上下文环境一直使用SpringBootTest引入上下文,现在由于启动类在A模块下面,无法引入启动类,无法加载上下文环境。我想到的解决办法有两个:

(1):在A模块中编写测试类,但是Mock不生效;

(2):在B模块的测试类中引入上下文环境,但是启动类不在B模块下面。

linlai255 avatar Jan 26 '22 09:01 linlai255

跨模块的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能力,但其最初设定的适用场景主要还是标准的单元测试(每个类有自己的测试类),在跨类跨模块等更偏向集成测试的场景里用起来会相对没那么顺手。

linfan avatar Feb 02 '22 13:02 linfan

好的,感谢感谢,了解了

linlai255 avatar Feb 18 '22 07:02 linlai255