Java FakeApplication启动时出现NullPointerException
我正在为一个web应用程序编写单元测试,并使用Java Play!(2.1.3)框架的FakeApplication类Java FakeApplication启动时出现NullPointerException,java,playframework,nullpointerexception,playframework-2.1,Java,Playframework,Nullpointerexception,Playframework 2.1,我正在为一个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() {
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);
这里有什么我做错了吗?从堆栈上看,NPE被抛出到您自己的
Global
类的第59行上-在您的GlobalSettings.onStart()覆盖内
查看/调试以了解问题所在。如果没有看到您的代码,很难再提出建议-可能是关于Global
的基本介绍,以及如何使用它
顺便说一下,还有几点
- 为什么
app
是一个静态变量?它可能是TagTest
的一个实例变量
- 您不必指出
TagTest
的第35行上有什么代码-这可以在stacktrace的最后第二行看到。跟踪的第一行显示了实际抛出异常的方法,其余的只是显示导致该方法调用的调用堆栈
使用调试器查看什么值是null
。我很确定你的应用程序值是null。您应该调试并找出它为空的原因:)谢谢@davnicwil的建议!我团队的另一位成员添加了该方法,我不知道它正在影响我的工作。目前有效地摆脱这种方法解决了我的问题我之所以将应用程序变量设置为静态变量,是因为我看到了一个建议,而且Helpers.fakeApplication()方法是一个静态变量-感谢大家的提醒:)没问题,很高兴它很有用:)Reapp
作为一个静态变量,当然,它在这种情况下也会像实例变量一样工作-更多的是风格问题,我倾向于尽可能避免使用静态变量-但请注意,Helpers.fakeApplication()
作为静态方法对返回的fakeApplication
对象引用没有影响-作为静态方法只是一个附带的实现细节,意味着它“属于”一个类,而不是该类的实例,无论app
是否为静态,您都可以将返回值分配给app
。