5

我们有用 Spring 3 编写的大型应用程序。我需要编写 JUnit 测试检查某些服务的行为。它不是一个单元,而是系统的一部分。它内部有一些服务和存储库一起工作->内部有很多注入的bean。该应用程序还使用方面。

我的问题是。在这种测试情况下如何管理配置和bean?我需要使用在应用程序配置中定义的 bean,并且在测试中只使用持久性重新定义 bean 以使用嵌入式数据库。所以我需要使用来自 src 的 bean,因为它们是定义的,并且只覆盖一些导致麻烦的问题(持久性 bean,使用 web 服务的 bean,......)但我不知道接下来会发生什么。我试图用以下方法注释测试配置类:

@Configuration
@EnableAspectJAutoProxy
@EnableTransactionManagement(mode = AdviceMode.ASPECTJ, proxyTargetClass = true)
@ComponentScan(basePackages = "com.example.our.app")
public class MyTestConfig implements TransactionManagementConfigurer {

扫描整个应用程序并使用 src 文件夹中的 bean 配置。但这也会从其他导致问题的测试中获取配置。这整个策略好不好?现在怎么办 - 使用 excludeFilters 删除其他测试配置?还是这个策略很糟糕?

谢谢

4

3 回答 3

2

我认为这里最好的使用方法是Spring profiles。现在检查此处以使用 H2 进行带有配置文件的测试。

于 2013-03-22T15:22:52.703 回答
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 {      
            ..
      }
于 2015-02-03T11:58:17.767 回答
0

您还可以使用另一个导入覆盖

<beans>
    <import resource="classpath*:applocationContext.xml" />
    <bean id="dataSourceFactory" class=com.demo.MyNewClass/>
</beans>

如果你在课堂上

this.applicationContext.getBean("dataSourceFactory");

检索类,你会看到新类的实例

更远

<bean id="dataSourceFactory" class="org.springframework.jdbc.datasource.DriverManagerDataSource" >
    <property name="driverClassName" value="${jdbc.driverClassName}"/>
    <property name="url" value="${jdbc.url}"/>
    <property name="username" value="${jdbc.username}"/>
    <property name="password" value="${jdbc.password}"/>
</bean>

所以有不同的方法可以覆盖默认行为

于 2015-06-30T14:23:21.793 回答