1

我在爲一個web應用程序編寫單元測試並使用Java Play! (2.1.3)框架的FakeApplication類。FakeApplication上的NullPointerException開始

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在考驗我的每一個四種不同的型號,但是當我運行播放測試命令,所有四個測試類返回一個類似的錯誤我的測試類的所有四個()方法:

[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); 

是有什麼我做錯了什麼?

+0

使用調試器查看'null'的值。 –

+0

我很確定你的'app'值是null。你應該調試並找出爲什麼它是空的:) – BlackHatSamurai

回答

2

從堆棧看起來像NPE是line 59你自己的Global類 - 在你的覆蓋GlobalSettings.onStart()

在那裏查看/調試以查看問題所在。如果沒有看到您的代碼,很難再提示 - 也許check this outGlobal的基本介紹以及如何使用它。

順便說一句 - 只是一對夫婦的附加分

  • 爲什麼app一個靜態變量?它應該可能是TagTest的實例變量。
  • 您不必指出TagTest的第35行代碼是什麼 - 這可以在堆棧跟蹤的倒數第二行看到。跟蹤的第一行顯示了實際拋出Exception的方法 - 其餘部分只顯示導致該方法調用的調用堆棧。
+0

感謝您的建議@davnicwil!我的團隊的另一位成員已經添加了該方法,但我並不知道這會影響我的工作。現在有效地擺脫這種方法解決了我的問題。 - 我讓應用變量是靜態的,因爲我看到[這裏]的建議(http://blog.matthieuguillermin.fr/2012/03/unit-testing-tricks-for-play-2-0-and-ebean /),因爲Helpers.fakeApplication()方法是一個靜態的 - 謝謝你的頭:) – Mark

+0

沒有probs,很高興這有幫助:)重新'應用程序是一個靜態變量,當然,它將工作在這種情況就像一個實例變量一樣 - 更多的是風格問題,我傾向於儘可能避免使用靜態變量 - 但要注意,作爲靜態方法的Helpers.fakeApplication()對返回的「FakeApplication」沒有影響對象引用 - 靜態方法只是一個附帶的實現細節,意味着它屬於一個Class而不是該類的實例,並且無論「app」是否爲靜態,您都可以將返回的值分配給「app」。 – davnicwil