我们在Spring 3中编写了大型应用程序。我需要编写一些服务的JUnit测试检查行为。它不是一个单元,而是系统的一部分。有一些服务和存储库协同工作 - >里面注入了很多豆子。该应用程序还使用方面。
我的问题是。在这种测试的情况下如何管理配置和bean?我需要使用app configes和测试中定义的bean,只使用持久性来重新定义bean以使用嵌入式数据库。所以我需要使用src中的bean,因为它们被定义并仅覆盖一些导致麻烦的问题(持久性bean,bean使用webservices,......) 在测试包中,我使用数据源为hsql使Config类定义了bean的持久性。但我不知道接下来会发生什么。我试着用:
注释Test配置类@Configuration
@EnableAspectJAutoProxy
@EnableTransactionManagement(mode = AdviceMode.ASPECTJ, proxyTargetClass = true)
@ComponentScan(basePackages = "com.example.our.app")
public class MyTestConfig implements TransactionManagementConfigurer {
扫描整个应用程序并使用src文件夹中的bean配置。但这也会引起其他导致问题的测试。这是一个好的策略吗?现在用什么 - 使用excludeFilters删除其他测试配置?或者这个策略是不是很糟糕?
感谢
答案 0 :(得分:2)
我认为这里使用的最佳方式是Spring profiles。 使用个人资料检查here now to use H2 for tests。
答案 1 :(得分:2)
您可以使用@ContextHierarchy
注释提供的上下文合并功能有选择地覆盖bean。
为了使这个用于您的用例,您必须创建一个基本上下文来扫描您的应用程序的Spring bean:
@Configuration
@ComponentScan({"com.example.our.app"})
public class MyTestConfig implements TransactionManagementConfigurer {
然后创建一个利用此上下文并将其命名为的基类 - 这不会使用命名的上下文!:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextHierarchy( {
@ContextConfiguration(name="testContext", classes = MyTestConfig.class),
})
public class BaseTest {
最后编写一个扩展基类的单元测试,并使用相同的名称定义一个新的上下文,用一个特定于测试的配置覆盖单个bean:
@ContextHierarchy(@ContextConfiguration(name="testContext", classes = OneUnitTest.Config.class))
public class OneUnitTest extends AggroBaseTest {
@Configuration
static class Config {
..
}
答案 2 :(得分:0)
您也可以使用其他导入覆盖
public enum TestEnum1{
Null = 0,
A,
B,
C,
Last
}
public enum TestEnum2{
Null = 0,
D = TestEnum1.Last,
E,
F,
Last
}
public enum TestEnum3{
Null = 0,
A = TestEnum2.Last,
B,
D,
}
如果你在课堂上
<beans>
<import resource="classpath*:applocationContext.xml" />
<bean id="dataSourceFactory" class=com.demo.MyNewClass/>
</beans>
检索该类,您将看到新类的实例
进一步
this.applicationContext.getBean("dataSourceFactory");
因此,有不同的方法可以覆盖默认行为