gpt4 book ai didi

单元测试环境中的Spring bean重新定义

转载 作者:IT老高 更新时间:2023-10-28 13:02:54 28 4
gpt4 key购买 nike

我们将 Spring 用于我的应用程序目的,并将 Spring 测试框架用于单元测试。不过我们有一个小问题:应用程序代码从类路径中的位置列表(XML 文件)加载 Spring 应用程序上下文。但是当我们运行单元测试时,我们希望一些 Spring bean 是模拟的,而不是成熟的实现类。此外,对于某些单元测试,我们希望一些 bean 成为 mock,而对于其他单元测试,我们希望其他 bean 成为 mock,因为我们正在测试应用程序的不同层。

这意味着我想重新定义应用程序上下文的特定 bean 并在需要时刷新上下文。在执行此操作时,我只想重新定义位于一个(或多个)原始 XML bean 定义文件中的一小部分 bean。我找不到一个简单的方法来做到这一点。一直以来,大家都认为 Spring 是一个单元测试友好的框架,所以我这里肯定漏掉了什么。

你有什么想法吗?

谢谢!

最佳答案

我会提出一个自定义的 TestClass 和一些简单的 spring bean.xml 位置规则:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {
"classpath*:spring/*.xml",
"classpath*:spring/persistence/*.xml",
"classpath*:spring/mock/*.xml"})
@Transactional
@TestExecutionListeners({
DependencyInjectionTestExecutionListener.class,
TransactionalTestExecutionListener.class,
DirtiesContextTestExecutionListener.class})
public abstract class AbstractHibernateTests implements ApplicationContextAware {

/**
* Logger for Subclasses.
*/
protected final Logger log = LoggerFactory.getLogger(getClass());

/**
* The {@link ApplicationContext} that was injected into this test instance
* via {@link #setApplicationContext(ApplicationContext)}.
*/
protected ApplicationContext applicationContext;

/**
* Set the {@link ApplicationContext} to be used by this test instance,
* provided via {@link ApplicationContextAware} semantics.
*/
@Override
public final void setApplicationContext(
final ApplicationContext applicationContext) {
this.applicationContext = applicationContext;
}
}

如果指定位置有 mock-bean.xml,它们将覆盖“正常”位置中的所有“真实”bean.xml 文件 - 您的正常位置位置可能不同。

但是……我永远不会混合使用模拟和非模拟 bean,因为当应用程序变老时很难追踪问题。

关于单元测试环境中的Spring bean重新定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/565334/

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