gpt4 book ai didi

java - 测试执行期间上下文中的模拟对象

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:10:18 25 4
gpt4 key购买 nike

我正在开发一个同时具有组件和集成测试的应用程序。它们之间的区别是:一个组件测试测试不止一个类(即,它的内部对象并没有全部被模拟出来——但其中一些可能是[比如 JMS 发布者]),而一个集成测试是一个什么都没有的测试一切都被 mock 了。换句话说,Spring 为您提供对象,您按原样对其进行测试。

到目前为止,还不错。

问题是:为了能够从 Spring 上下文中替换一个或另一个依赖项,我使用了 Springockito ( https://bitbucket.org/kubek2k/springockito/wiki/Home ),它为您提供了一种从 Spring 上下文中模拟出一些 bean 的方法。

所以 - 在组件测试中 - 我有这个:

@RunWith(SpringJUnit4ClassRunner.class)
@DirtiesContext(classMode = AFTER_CLASS)
@ContextConfiguration(loader = SpringockitoContextLoader.class, locations = "classpath:spring-classify-test.xml")
public class....

@Autowired
@ReplaceWithMock
private SomeServiceInterface someServiceInterface;
@Autowired
private Bean bean;

Bean 有 SomeServiceInterface 作为依赖项。

public class Bean { 
private SomeServiceInterface...

在上面的例子中,SomeServiceInterface 将被一个 mock 代替。当然,该示例过于简化了问题 - 我将 bean 替换为模拟对象,这些模拟对象在对象图中更靠下。

值得注意的是我从这个文件加载上下文:spring-classify-test.xml 另外值得注意的是我在类执行后将上下文标记为脏 - 所以,据我所知,下一个测试类必须重新加载上下文。

现在是集成测试:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(loader = SpringockitoContextLoader.class, locations = {"classpath:/spring-service-integration-test.xml" })
public class ...

@Autowired
private Bean bean;

我从 spring-service-integration-test.xml 加载上下文 - 但 Bean 内部的 SomeServiceInterface 仍然被模拟!集成测试中使用的上下文也发生了变化!

如果我用 @DirtiesContext(classMode = ClassMode.AFTER_EACH_TEST_METHOD) 标记集成测试,类中的第一个测试将失败,因为 SomeServiceInterface 被模拟 - 但下一个测试将通过,因为上下文已经刷新。

有趣的是:

如果我要求 Spring 在集成测试中注入(inject) SomeServiceInterface,它会注入(inject) SomeServiceInterface 的具体实现 - 而不是模拟!

我已经尝试了很多方法来解决这个问题:

  1. 在使用上下文中的 registerBeanDefinition 方法完成组件测试后,以编程方式覆盖上下文中的 bean

  2. 创建一个 TestExecution 监听器,以便我可以在执行 IntegrationTest 之前尝试手动刷新上下文

  3. 对不同的上下文使用相同的加载器....

  4. 这个故事还在继续。

有人知道吗?

P.S.:我完全理解采用 Springockito 是一个可疑的想法 - 但这个决定不是我做出的,现在我们在项目中有超过 500 个测试 - 因此重构它们以删除 Springockito 将是一项漫长的任务,因此它不是可行的 ATM 选项。

最佳答案

@DirtiesContext 注释由 DirtiesContextTestExecutionListener 处理当它在 TestContextManager 注册时.对于普通的 vanilla Spring 测试,默认情况下会注册该监听器。也许 Springockito 或您的测试“组件测试”中的其他东西正在做一些干扰默认监听器注册的事情?

关于java - 测试执行期间上下文中的模拟对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14636897/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com