这个问题不是一个showstopper,但我一直想知道是否有可能从bean中获取使用@ContextConfiguration(“mycontext.xml”)注释的类(测试类)的类对象。 mycontext.xml中定义的代码?
动机:
在我目前的项目中,我保留了不少测试弹簧背景,这些测试弹簧背景在几个月内变得越来越相似(因此,不是每次都进行微调,而是开始懒洋洋地拉动所有东西)。它已经到了这样的程度,它们通常只在它们运行的数据库初始化脚本中有所区别(如果它们开始时它们完全不同)。 所以我想到了一个简洁的方法来摆脱除了import和init-db标签之外的所有上下文xmls。
我主要寻找的解决方案:
使用注释注释单元测试类,该注释以某种方式设置我想要为测试用例运行的db init脚本的路径。注入property-placeholder值会或多或少地做,但能够运行1..n db脚本会很好。
我通过BeanFactoryPostProcessors和BeanPostProcessors来解决这个问题,但是对于初学者来说,我如何获得我在测试类中添加的魔术注释?
我希望这篇文章有道理,欢迎任何意见:)
答案 0 :(得分:0)
我使用JUnit,然后还有一个你可能尚未考虑过的陷阱。 Junit为每个测试用例创建一个测试类的新实例!
我觉得你尝试以错误的方式做所有的事情,或者让我们说一个复杂的事情。
为什么不为包含核心弹簧配置的每个db脚本填充一个小的spring配置,并且还引用db init脚本。
然后,您可以使用@ContextConfiguration
进行特定配置。
实施例
junit测试用例
@RunWith(SpringJUnit4ClassRunner.class)
@Transactional
@ContextConfiguration("classpath:/META-INF/spring/config1.xml")
public class MyTest {...}
config1.xml
...
<import resource="classpath:/META-INF/spring/applicationContext.xml" />
<bean class="MyDbScript">
<property name="file" value"classpath:/SCRIPTS/config1.sql" />
</bean>
...
其他解决方案不会在启动时自动设置数据库,而是在调用之后。
我不是100%肯定它的工作,因为我不知道在Spring之前或之后是否在测试用例中注入bean之前运行了@Before
注释的测试方法。
假设您有一个类HandTriggeredDbScriptExecutor
的bean,它有一个方法run
,可以运行脚本:
@RunWith(SpringJUnit4ClassRunner.class)
@Transactional
@ContextConfiguration("classpath:/META-INF/spring/applicationContext.xml")
public class MyTest {
@Autowire
HandTriggeredDbScriptExecutor handTriggeredDbScriptExecutor;
@Before
public void setUpDb() {
this.handTriggeredDbScriptExecutor.run("classpath:/SCRIPTS/config1.sql");
}
}