Springockito不继承@ContextConfiguration

时间:2016-01-26 13:51:36

标签: java spring spring-test springockito

我目前正在使用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 {
    //...

示例testclass:

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

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

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

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

......它有效。

有没有办法避免在我的所有测试类中添加@ContextConfiguration?这可能是在较新版本的Spring / Spring-tests中修复的吗?据我所知,它能够在不注释子类的情况下从超类继承locations部分,但loader部分在子类中没有注释时不起作用。我正在使用版本3.2.1.RELEASE Spring-test

以下是显示错误的示例项目:

http://www.filedropper.com/springockitobug

2 个答案:

答案 0 :(得分:2)

这是由于bug in Springockito

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

这里的问题是SpringockitoContextLoader错误地处理了声明类(即用@ContextConfiguration注释的类)而不是实际的测试类< / em>(可以是继承@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的作者

答案 1 :(得分:0)

不使用超类,而是使用注释。

例如:

@RunWith(SpringJUnit4ClassRunner.class)
@TestExecutionListeners({ DependencyInjectionTestExecutionListener.class, DirtiesContextTestExecutionListener.class})
@ContextConfiguration(loader = SpringockitoContextLoader.class, locations = "classpath:spring/test-context.xml")
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface TestConfiguration {
}

然后,使用

注释您的测试类
@TestConfiguration 
public class MyTest  {
    @Inject
    @ReplaceWithMock
    private MyService myService;
    //...

IDE的语法高亮可能会抱怨不允许注入,这取决于您使用哪种,但我的初始测试有此工作