如何测试Spring @Conditional bean

时间:2017-12-13 09:00:52

标签: spring spring-boot spring-test

我有一个@Conditional bean -

@RestController("/user")
@ConditionalOnProperty(prefix = "user-controller", name = "enabled", havingValue = "true")
public void UserController {

@GetMapping
public String greetings() {
  return "Hello User";
}

}

可以启用或禁用它。我想创建一个测试来涵盖两个用例。我怎样才能做到这一点?我只有一个 application.properties 文件:

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";
}

}
像这样

2 个答案:

答案 0 :(得分:3)

这不是一个完美的解决方案(因为它将加载两个Spring Boot应用程序上下文并且这需要时间)但您可以创建两个测试类,每个测试类通过设置@TestPropertySource或{{的属性来测试特定情况1}}

@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{...}

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

更好的解决方案可能是进行单一班级测试。

如果您使用Spring Boot 1,则可以检查@SpringBootTest(properties="user-controller.enabled=false") public class UserControllerDisabledTest{...}

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

答案 1 :(得分:2)

假设您使用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 "));
  }
}