【发布时间】:2019-03-06 14:41:40
【问题描述】:
我正在测试一个依赖于 bean 的类。在测试中,我模拟了 bean,但模拟的 bean 也有它自己的 @Autowired 依赖项。无论如何我可以满足这种依赖吗?现在,当调用 mock 中的方法时,@Autowired 依赖项为 null。
例子:
public class testclass {
@Autowired
private ClassToTest classToTest;
@MockBean
private DependencyOfClassToTest dependencyOfClassToTest;
@Mockbean
private MyOwnDependencyINeedHereInTheMock myOwnDependencyINeedHereInTheMock;
}
public class DependencyOfClassToTest {
@Autowired
private MyOwnDependencyINeedHereInTheMock myOwnDependencyINeedHereInTheMock;
}
如上所示,模拟 bean 包含一个 @Autowired 依赖项。
对此有任何解决方案还是我违反了某种测试规则?
当模拟 bean 中的实际方法被调用时,它会调用 myOwnDependencyINeedHereInTheMock,因为它是一个模拟 bean,所以该方法为 null。
MockBeans 在 @Autowired 类中不是 null,因此它们可以被 Spring Boot 找到。
【问题讨论】:
-
您确定您的测试使用的是 bean 的模拟版本吗?如果是,“真实”bean 的内部不应该是相关的,真正的 bean 碰巧有其他依赖项的事实是无关紧要的,这就是 mock 的重点。
-
@DaveyDaveDave 是的,除了该注释之外,我不会以任何其他方式将 bean 提供给我正在测试的类。
-
我认为您可能需要显示更多代码 - 您是否能够编辑您的帖子以包含测试(希望是 MCVE)?还有,你怎么知道
MyOwnDependencyINeedHereInTheMock是空的? -
如果你在模拟对象上调用方法,它总是会返回空值,你可能认为它发生是因为你的
MyOwnDependencyINeedHereInTheMock没有自动装配,但看起来你不知道如何使用模拟.您应该预定义被调用方法的行为。在这种情况下,如果您调用该方法,它应该返回您的预定义值,并且模拟对象内部的内容无关紧要(我的意思是MyOwnDependencyINeedHereInTheMock和另一个对象可以为空)。否则你测试配置有问题,你在真实对象上调用方法。
标签: java spring mockito spring-test