有没有一种不错的方法从xml读取spring应用程序上下文而不立即初始化bean,所以在实际创建之前它们可以被嘲笑或不被嘲笑?
是的,我知道lazy-init,但实际的applicationContext.xml对我来说是禁忌。
情况是我必须在一个应用程序上创建一些JUnit测试,该应用程序的创建方式会带来一些困难:
不得更改配置文件,也不得更改要测试的代码
有很多豆子,其中一些很复杂,难以模拟
测试的一部分是尽可能多地使用未经嘲笑的bean
一些bean实现InitializingBean
,在初始化时验证环境并在Jenkins尝试构建时抛出错误。
new FileSystemXmlApplicationContext("config.xml")
会立即初始化bean,如果不在适当的环境中则会抛出错误。
我尝试过:
我已经尝试过Powermock whenNew来模拟有问题的bean,但为了做到这一点,我必须知道实际创建bean的类。由于此类属于spring框架,因此可能会在将来的版本中发生变化。使用@PrepareEverythingForTest时会导致StackOverflow异常。该应用程序是现实生活,而不是一些教程中的一小段代码。
我还搜索了类似 ForceLazy FileSystemXmlApplicationContext的内容,但没有找到任何内容。
请不要开始唠叨糟糕的设计,我知道这一点。
答案 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/