代码之家  ›  专栏  ›  技术社区  ›  idmitriev

如何测试Spring@条件bean

  •  10
  • idmitriev  · 技术社区  · 8 年前

    我有一个@条件bean-

    @RestController("/user")
    @ConditionalOnProperty(prefix = "user-controller", name = "enabled", havingValue = "true")
    public void UserController {
    
    @GetMapping
    public String greetings() {
      return "Hello User";
    }
    
    }
    

    它可以启用或禁用。我想创建一个测试来涵盖这两个用例。我该怎么做?我只有一个 应用属性 文件:

    user-controller.enabled=true
    

    我可以将属性注入bean并添加setter来通过代码管理它,但这种解决方案并不优雅:

    @RestController("/user")
    @ConditionalOnProperty(prefix = "user-controller", name = "enabled", havingValue = "true")
    public void UserController {
    
    @Value("${user-controller.enabled}")
    private boolean enabled;
    
    public void setEnabled(boolean enabled) {
     this.enabled = enabled;
    }
    
    @GetMapping
    public String greetings() {
      return enabled ? "Hello User" : "Endpoint is disabled";
    }
    
    }
    

    smth像这样

    2 回复  |  直到 8 年前
        1
  •  15
  •   davidxxx    8 年前

    这不是一个完美的解决方案(因为它将加载两个Spring引导应用程序上下文,这需要时间),但您可以创建两个测试类,每个测试类通过设置 @TestPropertySource @SpringBootTest

    @TestPropertySource(properties="user-controller.enabled=true")
    public class UserControllerEnabledTest{...}
    

    @SpringBootTest(properties="user-controller.enabled=true")
    public class UserControllerEnabledTest{...}
    

    在测试启用案例和

    @TestPropertySource(properties="user-controller.enabled=false")
    public class UserControllerDisabledTest{...}
    

    @SpringBootTest(properties="user-controller.enabled=false")
    public class UserControllerDisabledTest{...}
    

    在测试禁用案例的测试类中。



    如果您使用Spring Boot 1,您可以检查 EnvironmentTestUtils.addEnvironment .

    如果您使用Spring Boot 2,您可以检查 TestPropertyValues .

        2
  •  14
  •   Kostyantyn Panchenko    6 年前

    假设您使用SpringBoot 2,您可以这样测试:

    public class UserControllerTest {
    
      private final ApplicationContextRunner runner = new ApplicationContextRunner()
          .withConfiguration(UserConfigurations.of(UserController.class));
    
      @Test
      public void testShouldBeDisabled() {
        runner.withPropertyValues("user-controller.enabled=false")
            .run(context -> assertThat(context).doesNotHaveBean("userController "));
      }
    }