gpt4 book ai didi

java - @ContextConfiguration 不随 Springockito 继承

转载 作者:行者123 更新时间:2023-12-02 04:00:10 24 4
gpt4 key购买 nike

我目前正在使用 springockito-annotations,这需要 @RunWith@ContextConfiguration 注释才能工作。我想将这些注释放在我的测试的父类(super class)上,但似乎无法让它工作。

父类(super class):

@RunWith(SpringJUnit4ClassRunner.class)
@TestExecutionListeners({ DependencyInjectionTestExecutionListener.class, DirtiesContextTestExecutionListener.class})
@ContextConfiguration(loader = SpringockitoContextLoader.class, locations = "classpath:spring/test-context.xml")
public class MyTestSuperclass {
//...

示例测试类:

public class MyTest extends MyTestSuperclass {
@Inject
@ReplaceWithMock
private MyService myService;
//...

使用此代码,myService 不会被替换为模拟。

但是,如果我将其更改为...

@ContextConfiguration
public class MyTest extends MyTestSuperclass {
//...

...它有效。

有没有办法避免将 @ContextConfiguration 添加到我的所有测试类?这个问题可能已在较新版本的 Spring/Spring-tests 中得到修复吗?据我所知,它能够从父类(super class)继承 locations 部分,而无需注释子类,但是 loader 部分在子类中没有注释的情况下无法工作。我正在使用 Spring-test 版本 3.2.1.RELEASE。

这是一个显示错误的示例项目:

http://www.filedropper.com/springockitobug

最佳答案

这是由于 bug in Springockito .

@ContextConfiguration 实际上是继承的,自从 Spring 2.5 引入以来一直如此。此外,配置的 loader(即本例中的 SpringockitoContextLoader)也是继承的,自 Spring 3.0 以来一直如此。

这里的问题是 SpringockitoContextLoader 错误地处理了声明类(即用 @ContextConfiguration 注释的类),而不是实际的测试类(可以是继承@ContextConfiguration声明的子类)。

经过彻底的调试,结果证明解决方案非常简单(实际上比原来的 SpringockitoContextLoader 实现更简单)。

以下 PatchedSpringockitoContextLoader 应该可以很好地替代损坏的 SpringockitoContextLoader

import org.kubek2k.springockito.annotations.internal.Loader;

import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.support.GenericApplicationContext;
import org.springframework.test.context.MergedContextConfiguration;
import org.springframework.test.context.support.GenericXmlContextLoader;

public class PatchedSpringockitoContextLoader extends GenericXmlContextLoader {

private final Loader loader = new Loader();

@Override
protected void prepareContext(ConfigurableApplicationContext context, MergedContextConfiguration mergedConfig) {
super.prepareContext(context, mergedConfig);
this.loader.defineMocksAndSpies(mergedConfig.getTestClass());
}

@Override
protected void customizeContext(GenericApplicationContext context) {
super.customizeContext(context);
this.loader.registerMocksAndSpies(context);
}

}

问候,

Sam(Spring TestContext 框架的作者)

关于java - @ContextConfiguration 不随 Springockito 继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35015385/

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