获取使用@ContextConfiguration注释的类的类对象?

时间:2011-08-17 21:31:08

标签: unit-testing spring

这个问题不是一个showstopper,但我一直想知道是否有可能从bean中获取使用@ContextConfiguration(“mycontext.xml”)注释的类(测试类)的类对象。 mycontext.xml中定义的代码?

动机:

在我目前的项目中,我保留了不少测试弹簧背景,这些测试弹簧背景在几个月内变得越来越相似(因此,不是每次都进行微调,而是开始懒洋洋地拉动所有东西)。它已经到了这样的程度,它们通常只在它们运行的​​数据库初始化脚本中有所区别(如果它们开始时它们完全不同)。 所以我想到了一个简洁的方法来摆脱除了import和init-db标签之外的所有上下文xmls。

我主要寻找的解决方案:

使用注释注释单元测试类,该注释以某种方式设置我想要为测试用例运行的db init脚本的路径。注入property-placeholder值会或多或少地做,但能够运行1..n db脚本会很好。

我通过BeanFactoryPostProcessors和BeanPostProcessors来解决这个问题,但是对于初学者来说,我如何获得我在测试类中添加的魔术注释?

我希望这篇文章有道理,欢迎任何意见:)

1 个答案:

答案 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");
    }        
}