禁用基于Spring属性的整个测试(和加载上下文)

时间:2019-07-11 15:46:17

标签: spring testing

当我在Spring 5(不是Spring Boot)应用程序上工作时,我正在尝试在工作流中应用TDD,但是我的运行测试大约需要45s,这使我的开发周期相当慢。标准单元测试非常快速,但是我有一个测试可以验证Spring上下文配置-它需要30多个时间。

我的想法是在开发周期中每次都禁用此特定测试,并不时运行它-例如当我使用应用程序创建Docker映像/进行更改的提交/推送时。

因此,这是我到目前为止的想法:

  1. 运行docker-profile时定义属性:

    <profiles>
      <profile>
        <id>docker-build</id>
        <properties>
            <build.profile.id>docker-build</build.profile.id>
        </properties>
        <build>...</build>
      </profile>
    </profiles>
    
  2. test.properties中使用它:

    app.profile=${build.profile.id}
    
  3. 在测试中使用@EnabledIf批注:

     @TestPropertySource("classpath:test.properties")
     @SpringJUnitConfig( classes = MainConfiguration.class )
     @EnabledIf("#{'${app.profile}' == 'docker-build'}")
     public class SpringConfigTest {
       ...
     }
    

它似乎不起作用-我可能是错的,但是当我在app.profile中调用@EnabledIf属性时似乎不可用。 或者也许我走错了路线,并且有一种更简单的方法来禁用此特定测试-目前,我以mvn test的身份运行它。我想知道为什么app.profile的{​​{1}}属性不可见。

修改 我发现我可以跳过前两个步骤并在命令行中定义属性:

@EnabledIf

但不确定为什么我无法从mvn -Dapp.profile=docker-build test 文件中获取财产

1 个答案:

答案 0 :(得分:0)

我认为在这种情况下,您需要为@EnabledIf的春季版本加载上下文,以评估表达式。这样就可以了:

@EnabledIf(expression = "#{'${app.profile}' == 'docker-build'}", loadContext = true)

还要确保属性文件包含在启用过滤的maven testResources中:

    <build>
        <testResources>
            <testResource>
                <directory>src/test/resources</directory>
                <filtering>true</filtering>
            </testResource>
        </testResources>
    </build>

我认为以上所述应解决您面临的特定财产问题。但是,因为这不会跳过加载spring上下文,所以也许更好的方法是在maven配置文件中配置为基于包或测试类名称跳过测试-与Is there a way to tell surefire to skip tests in a certain package?

类似