当前位置: 首页 > 知识库问答 >
问题:

Spring 中的 JUnit 测试 - 覆盖和忽略应用程序中的 bean 其他配置类

逄学潞
2023-03-14

我们有一个用Spring3编写的大型应用程序。我需要编写一些服务的JUnit测试检查行为。它不是一个单元,而是一个系统的一部分。有一些服务和存储库在现场协同工作-

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

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

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

谢谢

共有3个答案

樊博雅
2023-03-14

您还可以使用其他导入进行覆盖

<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>

因此,您可以通过不同的方式覆盖默认行为

衡子安
2023-03-14

您可以使用@ContextHi

为了让它适合您的用例,您必须创建一个基本上下文来扫描您的应用程序以查找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 {      
            ..
      }

茅高卓
2023-03-14

我认为这里最好的使用方式是Spring配置文件。现在点击此处,使用H2进行剖面测试。

 类似资料:
  • 我已经编写了许多通过RESTAPI调用进行通信的服务。这些服务可以配置为使用HTTP或HTTPS。任何给定的客户端都具有定义到服务器的连接的安全配置。“默认”配置属性由应用程序中的值设置。yml在这一点上效果很好。 然而,我逐渐意识到,这在更现实的情况下并不适用。问题是,我试图设置特定的参数,例如启动客户端时的服务器主机/端口,而我设置的值被忽略。 例如: 服务A(客户端)将出于某种目的与服务B(

  • 我试图将一个应用程序从spring-boot1迁移到Spring-Boot2,但是我在spring-boot部分遇到了很多困难: 我有这个日志: 上下文初始化期间遇到异常-取消刷新尝试:org.springframework.beans.factory.BeanCreationException:创建名为“org.springframework.boot.autocigure.liquibase.

  • 然后我们有这样的服务: 我的第一个bean是由@repository注释创建的,另一个bean是在Spring配置类中声明的: 如果我运行我的应用程序,SomeServiceImpl中的属性someDaoAnotherDataSource没有在配置类中声明我的bean,而是用注释存储库声明了bean。

  • 我使用的是Spring4.3.x。 我看过很多相关的帖子,但没有一篇给我答案。如有任何帮助,我们将不胜感激。

  • 我是新的stackoverflow,但阅读吨的帖子在这里和现在stuck.myapplication.properties阅读,但配置hikaricp的部分被忽略/没有影响。 我读了https://www.javadevjournal.com/spring-boot/spring-boot-hikari/,在那里遵循了这些步骤,仍然取得了任何成功。 波姆。xml 应用属性 黑名单申请。课程: 配置

  • 为了能够测试应用程序的某些方面,我创建了这个测试设置。因为我需要的自定义实现,所以无法使用经典的注释来完成,而是使用了以下initialisazion: 所敬畏的SaveMetestApplication: 是一个将某些配置和必需的bean结合在一起的配置: 然后是引用的,其中有两个bean是自动连线的: 自动连线的两个bean是在导入的中定义的。当我使用启动测试时,我得到了实际找到的bean的日