首页 > 解决方案 > How make code that uses global dynamic properties unit testable?

问题描述

A lot of code needs to use some global flag or properties to control the flow of the application. It is necessary for a lot of scenarios to maintain a Dynamic Cache which will have a flag to lock/unlock a particular piece of (new)code.

For all such scenarios I usually write this way:

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

}

DynamicPropery is a Singleton which periodically refreshes the cache from the DB.
The problem with this is Unit testing is little tricky, so far I've used Jmockit to get around that - and it works fine.
But I was wondering if there can be a better way to write a method like that that can be easier for Unit testing.

标签: javaunit-testingjunitdependency-injectiontestability

解决方案


您可以以某种方式隔离所有属性检索,PropertyResolverBean然后将其注入您的 SUT 并替换静态调用:

private PropertyResolverBean injectedPropertyResolverBean;

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

}

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

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


推荐阅读