2009-08-21 109 views
3

我有一個NetBeans項目,在一個單獨的測試文件夾中設置了一堆源類和大約10個jUnit測試類。Netbeans - 源類無法訪問測試類?

從測試文件中,我可以導入任何其他測試文件或源類。但是,從正常的源文件中,NetBeans的行爲就好像Test類不存在一樣。自動完成對他們將無法正常工作,如果我嘗試使用它們,我會得到一個編譯錯誤。

我明白通常使用常規源代碼中的Test類是沒有意義的,但在這種情況下我有一個很好的理由。我的部分程序接受一個類名作爲字符串,並用反射來創建它的實例。我的一個jUnit測試調用這個方法來測試它,並將它傳遞給一個Test類的名字。這總是失敗,因爲正常的程序代碼無法從Test文件夾中找到任何類。

+0

你能張貼堆棧跟蹤?也許真正的問題是你傳入的類名中的拼寫錯誤?我希望它們能夠在運行時在同一個類路徑中運行,所以應該可以通過反射回溯到測試類。我想知道這裏是否還有別的東西在發生。 – jsight 2009-08-21 02:29:29

回答

2

運行測試時,類路徑將包含源類和測試類。他們必須,而且我認爲實際上不可能在運行時阻止其他人訪問對方,即使是類加載器也是如此。我當然非常懷疑Netbeans是否正在這樣做,即使它在理論上是可能的。

有兩種可能性,我可以猜測。一個是,錯誤不是你認爲的那樣。如果您發佈堆棧跟蹤,我們可以幫助您。

另一個是你使用錯誤的類加載器來加載類(即不只是使用Class.forName())。你可以發佈代碼snippit做類加載嗎?

6

我不確定這是否會成爲大多數人的意見,但這裏是我的看法:如果您的程序因爲無法從源代碼類訪問測試類而失敗,那麼您做錯了事。我不在乎你是否認爲你有一個很好的理由,你不知道。 (好吧認爲你不這樣做。)

也許你需要將測試類移入項目本身。或者在你的情況下,你可能需要配置類路徑進行測試......我無法確定如何建議在不訪問代碼的情況下解決問題。從源類的角度來看,測試類似乎不應該存在,除非項目正在測試。

+0

我想我並不完全清楚。測試過程中出現此問題。我有一個jUnit測試,它正在測試基於作爲字符串傳遞的類名實例化類的方法。我希望它在測試過程中實例化的類是另一個Test類,它不應包含在常規源中。 – takteek 2009-08-21 02:21:03

+0

同意。如果你使用反射來訪問類,那麼你應該沒有具體的引用你加載的任何類,在這種情況下,你不應該得到一個編譯錯誤,你應該得到一個運行時錯誤。 – Zoidberg 2009-08-21 02:21:46

+0

這是同意大衛...... – Zoidberg 2009-08-21 02:22:28

0

我遇到了一個非常類似的問題,最終發現在Test文件夾下實現的模擬對象根本就沒有被編譯,因爲我從來沒有直接實例化它們。換句話說,我的代碼將無法在這裏:

Class gatewayClass = Class.forName(System.getProperty("com.ov.MockGateway")); 

即使我有test/com/ov/MockGateway.java設置正確。由於我沒有明確創建MockGateway的實例,因此NetBeans有意跳過編譯它。如果我手動編譯文件,通過從Projects視圖中選擇並按F9,然後我的測試運行得很好。

我的工作,周圍是下面的代碼添加到我的單元測試,迫使NetBeans的編譯模擬對象類:

​​