【问题标题】:NullPointerException on FakeApplication startFakeApplication 启动时出现 NullPointerException
【发布时间】:2013-08-28 07:30:34
【问题描述】:

我正在为 Web 应用程序编写单元测试并使用 Java Play! (2.1.3) 框架的 FakeApplication 类。

public class TagTest {
    public static FakeApplication app;    
...
    // BeforeClass only runs once before any tests are run
    @BeforeClass
    public static void setUpBeforeClass() {
        // Set up new FakeApplication before running any tests
        app = Helpers.fakeApplication(Helpers.inMemoryDatabase());
        Helpers.start(app);
    }
...
}

我在所有四个测试类中都有相同的 setUpBeforeClass() 方法来测试我的四个不同模型中的每一个,但是当我运行 play test 命令时,所有四个测试类都返回类似的错误:

[error] Test models.TagTest failed: java.lang.NullPointerException: null
[error]     at Global.onStart(Global.java:59)
[error]     at play.core.j.JavaGlobalSettingsAdapter.onStart(JavaGlobalSettingsAdapter.scala:17)
[error]     at play.api.GlobalPlugin.onStart(GlobalSettings.scala:175)
[error]     at play.api.Play$$anonfun$start$1$$anonfun$apply$mcV$sp$1.apply(Play.scala:68)
[error]     at play.api.Play$$anonfun$start$1$$anonfun$apply$mcV$sp$1.apply(Play.scala:68)
[error]     at scala.collection.immutable.List.foreach(List.scala:309)
[error]     at play.api.Play$$anonfun$start$1.apply$mcV$sp(Play.scala:68)
[error]     at play.api.Play$$anonfun$start$1.apply(Play.scala:68)
[error]     at play.api.Play$$anonfun$start$1.apply(Play.scala:68)
[error]     at play.utils.Threads$.withContextClassLoader(Threads.scala:18)
[error]     at play.api.Play$.start(Play.scala:67)
[error]     at play.api.Play.start(Play.scala)
[error]     at play.test.Helpers.start(Helpers.java:354)
[error]     at models.TagTest.setUpBeforeClass(TagTest.java:35)

第 35 行是行:

Helpers.start(app);

我在这里做错了吗?

【问题讨论】:

  • 使用调试器查看null是什么值。
  • 我很确定您的 app 值为空。您应该调试并弄清楚它为什么为空:)

标签: java playframework nullpointerexception playframework-2.1


【解决方案1】:

从堆栈中看,NPE 被抛出在您自己的 Global 类的 第 59 行 - 在您的 GlobalSettings.onStart() 覆盖范围内?

在那里查看/调试以了解问题所在。很难在没有看到您的代码的情况下提出更多建议 - 可能是 check this outGlobal 的基本介绍以及如何使用它。

顺便说一句 - 只是补充几点

  • 为什么app 是静态变量?它应该是TagTest 的实例变量。
  • 您不必指出TagTest 的第 35 行上的代码 - 这可以在堆栈跟踪的倒数第二行中看到。跟踪的第一行显示实际引发异常的方法 - 其余的只是显示导致该方法调用的调用堆栈。

【讨论】:

  • 感谢@davnicwil 的建议!我团队的另一位成员添加了这种方法,我没有意识到它正在影响我的工作。现在有效地摆脱这种方法已经解决了我的问题。 - 由于我看到here 的建议,并且因为 Helpers.fakeApplication() 方法是静态方法,我将 app 变量设为静态 - 感谢您的提醒 :)
  • 没有问题,很高兴它有帮助:) Re app 是一个静态变量,当然,它在这种情况下和实例变量一样有效 - 更多的是风格问题,我倾向于尽可能避免使用静态变量 - 但请注意 Helpers.fakeApplication() 作为静态方法对返回的 FakeApplication 对象引用没有影响 - 静态方法只是附带的实现细节,这意味着它“属于”类而不是比该类的实例,您可以将返回值分配给app,无论app 是否为静态。
猜你喜欢
  • 2013-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
  • 2012-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多