java - 如何使使用全局动态属性的代码可进行单元测试?

标签 java unit-testing junit dependency-injection testability

许多代码需要使用一些全局标志或属性来控制应用程序的流程。在很多情况下,维护动态缓存是必要的,动态缓存将有一个标志来锁定/解锁特定的(新)代码。

对于所有此类场景,我通常这样写:

''' 
void someMethod(Data data){
  if(DynamicProperty.getValue("OK"))
    // Do Something

}

DynamicPropery 是一个单例,它定期从数据库刷新缓存。
问题是单元测试有点棘手,到目前为止我已经使用Jmockit来解决这个问题 - 而且它工作得很好。
但我想知道是否有更好的方法来编写这样的方法,可以更容易进行单元测试。

最佳答案

您可以将所有属性检索隔离在某种 PropertyResolverBean 中,然后将其注入(inject)到您的 SUT 中并替换静态调用:

private PropertyResolverBean injectedPropertyResolverBean;

void someMethod(Data data){
  if(injectedPropertyResolverBean.getValue("OK"))
    // Do Something

}

然后,您可以使用 Mockito 的基本功能来模拟该 bean 并按照您想要的方式预配置测试。

最终您将获得遵循 SRP 规则的更易于维护、可读和可测试的代码。

关于java - 如何使使用全局动态属性的代码可进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56505058/

相关文章:

java - 对 Verticle 部署进行单元测试

java - 获取局域网内所有IP和MAC地址

java - Java 编译时如何抛出异常

java - 在 Eclipse 中构建项目时 Checkstyle 不起作用

Perl 单元测试模拟

android - 使用 Mockito 模拟 PreferenceManager

spring - 如何在 MockMVC 中模拟某些 bean 而不是其他 bean?

java - 如何在Java中比较长整型变量和数字

python - 在 Python 中模拟 Google App Engine 文件上传

api - Laravel API测试-如何测试具有外部API调用的API