0

看起来 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() 将抛出 NPE 而不会在 FakeApplication 上运行。

一切都以静态方式进行,没有Mocking的余地。

您能否推荐任何具有适当测试隔离的良好最佳实践?

我必须始终使用集成测试吗?(与数据库、缓存、API 等各种东西建立联系)

4

1 回答 1

1

这对我来说也很艰难。

值得庆幸的是,play 2.1+ fakeapplication 比 play 2.0 好很多,我建议你使用 FakeApplication。

暂停生效....


如果你真的真的真的不想运行假应用程序,这就是我所做的。

创建一个“影子”配置根,基本上,读取相同的文件。所以基本上:

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 方法分解为更小的方法(无论如何都是最佳实践)并单独调用它们。

于 2013-11-05T14:56:23.023 回答