我目前正在玩springockito-annotations,这需要@RunWith@ContextConfiguration批注才能起作用。我想将这些注释放在我的测试的超类中,但似乎无法使其正常工作。

超类:

@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中是否已解决此问题?据我所知,它可以从超类继承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 Framework的作者)

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

10-09 19:58