我目前正在玩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/