在play2框架中看起来单元测试对我来说非常困难
由于框架自身的风格,许多代码都是静态编写的,并且彼此紧密耦合。
例如,
boolean isExample = Configuration.root().getBoolean("example.flag");
....
public class Global extends GlobalSettings {
@Override
public void onStart(Application app) {
Akka.system().scheduler().schedule .....
}
}
启动Akka调度是针对GlobalSettings的具体类的onStarting方法,并且在FakeApplication启动时将触发它。
Configuration.root()将在不运行FakeApplication的情况下抛出NPE。
一切都以静态的方式进行,没有嘲弄的空间。
您能否推荐任何具有适当测试隔离度的最佳实践?
我是否必须始终使用集成测试? (与DB,Cache,API ......等各种东西建立连接)
答案 0 :(得分:1)
对我来说这也很难。
值得庆幸的是,播放2.1+假应用比播放2.0更好,我建议你使用FakeApplication。
暂停效果....
如果你真的真的不想运行假应用程序,那就是我做的。
创建“Shadow”配置root,基本上,读取相同的文件。所以基本上:
boolean isExample = Configuration.root().getBoolean("example.flag");
替换为:
boolean isExample = MyConfigurationLoader.getBoolean("example.flag");
其中:
class MyConfigurationLoader {
public static getBoolean(String key){
// I use a try catch but maybe better is passing a flag/variable
// like from the ENV so System.getenv("TEST_MODE").equals("TRUE")
try {
return Configuration.root().getBoolean(key);
} catch (NPE) {
return alternativeGetBoolean(key);
}
}
}
最后,将akka方法分解为更小的方法(无论如何最佳实践)并单独调用它们。