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

为许多不同的配置文件集测试一个Spring测试类

颜志业
2023-03-14

我正在与:

  • Spring Framework4.3.10
  • JUnit4.12
  • 分级4.3.1

我有这两个测试类

@Transactional
@RunWith(Parameterized.class)
@ContextConfiguration(classes={RootApplicationContext.class})
@ActiveProfiles(resolver=TestJdbcActiveProfilesResolver.class)
@TestExecutionListeners(listeners={LoggingTestExecutionListener.class}, mergeMode=MergeMode.MERGE_WITH_DEFAULTS)
public class PersonaServiceImplJdbcTest {


@Transactional
@RunWith(Parameterized.class)
@ContextConfiguration(classes={RootApplicationContext.class})
@ActiveProfiles(resolver=TestHibernateActiveProfilesResolver.class)
@TestExecutionListeners(listeners={LoggingTestExecutionListener.class}, mergeMode=MergeMode.MERGE_WITH_DEFAULTS)
public class PersonaServiceImplHibernateTest {
    null
  • Spring Boot/JUnit,为多个配置文件运行所有单元测试

但是我希望避免通过MavenGradle使用命令,它通过TestXXXActiveProfilesResolver类保持控件。

共有1个答案

孔山
2023-03-14

对于JUnit4,我最后执行了以下操作(向下滚动):

@Transactional
@RunWith(Parameterized.class)
@ContextConfiguration(classes={RootApplicationContext.class})
//@ActiveProfiles() ... disable
@TestExecutionListeners(listeners={LoggingTestExecutionListener.class}, mergeMode=MergeMode.MERGE_WITH_DEFAULTS)
public abstract class PersonaServiceImplTest {

   ...

   @Autowired
   private Environment environment;

   @Before
   public void setup(){
    logger.info("Profiles: {}", Arrays.toString(environment.getActiveProfiles()));
   }

   //@Test disable
   public void someTest(){

     assertThat(...)

   }

    @ActiveProfiles(resolver=TestJdbcActiveProfilesResolver.class)
    public static class ForJdbc extends PersonaServiceImplTest {

        public ForJdbc(Persona persona){
            super(persona);
        }

        @Test
        @Override
        @Sql(scripts={"classpath:/.../script.sql"})//when be necessary
        public void someTest()(){
            super.someTest()();
        }

      }

    @ActiveProfiles(resolver=TestHibernateActiveProfilesResolver.class)
    public static class ForHibernate extends PersonaServiceImplTest {

        public ForHibernate(Persona persona){
            super(persona);
        }

        @Test
        @Override
        @Sql(scripts={"classpath:/.../script.sql"})//when be necessary
        public void someTest()(){
            super.someTest()();
        }

        ...

      }

   }

意见:

  • 外部类必须是抽象
  • 外部类必须没有声明@ActiveProfiles
  • 外部类有要测试的方法,每个方法都不能声明@test
  • Environment是可选的,但它可以通过使用@before
  • 注释的通用方法,让您知道为每个 静态嵌套类激活的配置文件
  • 每个静态嵌套类必须公共
  • 每个静态嵌套类必须扩展外部类
  • 每个静态嵌套类必须具有@ActiveProfiles
  • 每个静态嵌套类重写每个测试方法,只是为了使用super调用相应的重写方法
  • 每个静态嵌套类,对于每个测试重写的方法,它必须具有@test.
  • @sql不能重用,必须为每个重写的方法声明它
 类似资料:
  • 我们有一个基于Spring的JUnit测试类,它利用一个内部测试上下文配置类 最近,服务类中引入了新的功能,相关测试应添加到ServiceTest中。但是,这也需要创建不同的测试上下文配置类(现有配置类的内部结构相当复杂,如果可能的话,将其更改为既服务于旧测试又服务于新测试似乎非常困难) 有没有一种方法可以实现一个测试类中的某些测试方法将使用一个配置类,而其他方法将使用另一个?似乎只适用于类级别,

  • 是否支持不同的测试配置文件?在我的本地测试期间,我想使用“mvn包”,它使用“测试”配置文件。这指向我的本地主机数据库。对于我的 DevOps 工具链,我想使用不同的测试配置文件,因为我们使用的是容器,不能使用本地主机。目标是区分本地计算机测试和云环境。测试。

  • db-config-test.xml Maven插件: StackError:

  • 我有一些问题。 允许在集成测试类中自动拥有控制器? 如何为这个控制器创建bean. 我有配置问题:help:

  • 我有一个maven项目(multimodule,JDK11),其中有很多模块和测试。 编辑:问题发生在一个测试中,该测试属于我公司一个较大项目的一部分,该项目在POM继承链中继承了各种默认值。不幸的是,我不能只把我的POM从它中分离出来并呈现出来。我试图在一个新的独立项目中重现这个问题,但没有成功(也就是说,所有测试都按预期调用了)。 我错过了什么?surefire插件是否有一个隐藏的开关,它揭示

  • 我如何告诉Spring使用这些不同的概要文件运行每个测试?事实上,每个配置文件将与不同的数据源(内存中的h2、外部mysql、外部oracle、..)对话所以我的存储库/数据源必须重新初始化。 我知道我可以指定@ActiveProfiles(...)我甚至可以扩展BaseTest并覆盖ActiveProfile注释。虽然这会起作用,但我只显示了测试套件的一部分。我的许多测试类都是从BaseTest