首页 > 解决方案 > 如何在 Mockito 中对 if/else 语句进行单元测试

问题描述

应用程序.yml

feature:
  toggles:
    checksLoginAndRegistration: true

用户存储库.java

@Value("${feature.toggles.checksLoginAndRegistration}")
private boolean checksLoginAndRegistration;
    
private void validateLicense(LicenseData licenseData,RegistrationData registrationData) {
        validateAddress(registrationData, UserRepository::logWarning);
        if(checksLoginAndRegistration) {
            try {
                service.validateRegistration(registrationData);
            } catch (RgValidationException rgValidationException) {
                throw new AccountRegulationBlockedException(registrationData.username());
            }
        }
    }

所以我需要测试 checksLoginAndRegistration=true 还是 false。

标签: javaunit-testingmockito

解决方案


最简单的方法将需要小的重构。

构造函数注入示例:

public class LogingChecker{
  private final boolean checksLoginAndRegistration;
  public LogingChecker(@Value("${feature.toggles.checksLoginAndRegistration}") boolean checksLoginAndRegistration){
    this.checksLoginAndRegistration = checksLoginAndRegistration;
  }
...

}

之后,您可以使用适当的标志轻松地为测试实例化您的类

如果有很多标志,您可以使用 setter 注入而不是构造函数注入。如果您决定所有这些标志都可以分组到单独的类中,那么创建例如 LoginProperties 类,其中包含所有可以使用的标志并使用构造函数注入(LoginProperties 应该是组件)。

另一种不需要任何重构但不是好的 IMO 的方法:https ://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/test/util/ReflectionTestUtils.html

您可以使用以下命令操作标志:

ReflectionTestUtils.setField(nameOfYourService, "checksLoginAndRegistration", true);

推荐阅读