我目前正在使用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
。
以下是显示错误的示例项目:
答案 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的语法高亮可能会抱怨不允许注入,这取决于您使用哪种,但我的初始测试有此工作