java - 如何在 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。
解决方案
最简单的方法将需要小的重构。
构造函数注入示例:
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);
推荐阅读
- java - 显示下一个对象 OnClickListener Android Studios
- javascript - 关于带小数的数字的奇怪字符串行为
- vb.net - 从本地目录下载文件?
- javascript - 正则表达式删除除@之外的所有非字母数字
- python - 如何在snakemake中处理可变数量的复制
- amazon-web-services - AppConfig 可以用于跨账户部署吗?
- swift - TabBarController:总是跳转到根 NavigationController
- javascript - @firebase/firestore:Firestore (7.16.0):连接 GRPC 流错误。代码:1 消息:1 CANCELLED:操作已取消
- firebase - .once() 在使用 Flutter 和 Firebase 时似乎不起作用/无法识别
- typescript - 打字稿:第一次编译总是失败,但第二次成功