从Spring应用程序上下文xml获取bean描述而不初始化bean?

时间:2017-09-16 13:59:39

标签: java spring junit mockito

有没有一种不错的方法从xml读取spring应用程序上下文而不立即初始化bean,所以在实际创建之前它们可以被嘲笑或不被嘲笑?

是的,我知道lazy-init,但实际的applicationContext.xml对我来说是禁忌。

情况是我必须在一个应用程序上创建一些JUnit测试,该应用程序的创建方式会带来一些困难:

  1. 不得更改配置文件,也不得更改要测试的代码

  2. 有很多豆子,其中一些很复杂,难以模拟

  3. 测试的一部分是尽可能多地使用未经嘲笑的bean

  4. 一些bean实现InitializingBean,在初始化时验证环境并在Jenkins尝试构建时抛出错误。

  5. new FileSystemXmlApplicationContext("config.xml")会立即初始化bean,如果不在适当的环境中则会抛出错误。

    我尝试过:

    我已经尝试过Powermock whenNew来模拟有问题的bean,但为了做到这一点,我必须知道实际创建bean的类。由于此类属于spring框架,因此可能会在将来的版本中发生变化。使用@PrepareEverythingForTest时会导致StackOverflow异常。该应用程序是现实生活,而不是一些教程中的一小段代码。

    我还搜索了类似 ForceLazy FileSystemXmlApplicationContext的内容,但没有找到任何内容。

    请不要开始唠叨糟糕的设计,我知道这一点。

2 个答案:

答案 0 :(得分:0)

您可以编写自己的applicationContext用于测试目的。在那里你需要编写自己的BeanFactory。在那个工厂里,你可以用嘲笑替换一些豆子。

答案 1 :(得分:0)

我只记得一个选项。评估您是否可以使用弹簧配置文件。它允许根据配置文件选择不同的实现。

示例:

<!-- This is the default myBean -->
<beans>
    <bean id="myBean" class="mypackage.MyBean" />
</beans>
<!-- This is the mocked myBean for testing purposes, it will take place when testingProfile is active -->
<beans profile="testingProfile">
    <bean id="myBean" class="mypackage.MyBeanMock" />
</beans>

您可以通过属性或环境变量指明要使用的配置文件。例如,如果您在项目中使用maven,则可以将测试运行为:

mvn test -Dspring.profiles.active="testingProfile"

看看:

http://www.baeldung.com/spring-profiles

https://spring.io/blog/2011/02/11/spring-framework-3-1-m1-released/