2017-04-24 42 views
1

是否有單元測試註釋或功能標記,我可以在我的java源代碼中插入,以便只有在運行單元測試時纔會觸發該方法?使用單元測試從源類執行特定的方法

例如:

public class A {   
    @Annotation 
    public void fooA() { } 

    public void fooB() { } 
} 

我的單元測試類:

public class TestA { 
    ... 
} 

在這種情況下,當我跑我的單元測試類種皮,我想執行fooA()和fooB( )

但是,如果我想運行包含classA的prod源代碼,那麼只有函數將執行fooB(),而不是fooA()

+1

不遵循它的推理。你不應該在意這個環境。如果測試需要一些特殊的環境 - 讓它們爲自己設置。 – amit

+0

那麼這個「設計測試」? 'fooA()'只公開,所以你可以稱它爲測試工具的一部分?本質上它應該是一種私人方法,但你必須公開它,以便測試它。 – markspace

+0

你爲什麼要浪費精力測試一些甚至沒有包含在軟件生產版本中的東西? – Michael

回答

3

一般:不要去那裏。

您的產品代碼有一個責任;只有一個責任:做生產工作。您不考慮複雜測試相關方面。

有時,可能需要或有幫助有一個構造函數需要更多參數(用於依賴注入)。然後,只要讓這個東西包受到保護,並在那裏放一個非正式的「/ **單元測試* /」評論。

我的意思是:沒有這樣的註釋。而且它也沒有意義。你用清晰的javadoc描述你的外部接口,你編寫你的類,使它變成明顯,用戶應該只使用/調用fooB()

問題是:你想要發生的最後一件事是代碼中的一些僅測試工件會在生產環境中導致問題。避免這種風險的最佳方法是:不要創建這樣的工件。

+0

你是;歡迎; – Michael

+0

對不起,你們不懂這個笑話:p –

+0

你的回答很有道理。我的想法陷入了無限循環。重構邏輯prod代碼是要走的路! :P –

0

您可以將您的測試包聲明爲與被測單元(UUT)相同。

package com.example.fubar.arglebargle; 
public class A { 
    // package-private, TEST ONLY! 
    void fooA() { } 

    public void fooB() { } 
} 

的單元測試類:

package com.example.fubar.arglebargle; 
public class TestA { 
    // etc... 
} 

我的IDE和JUnit測試自動執行此操作。我的所有測試都與我的UUT在同一個包中聲明(儘管它們顯然是在完全不同的源代碼樹中;不要將測試和生產源放在同一個子目錄中!)。

這對於訪問一些內部不可用的內部組件很方便。這似乎也是標準做法,所以我認爲沒有任何反對的做法。

這不會阻止每個人呼叫fooA(),但它會限制潛在的問題,以類與你的班級相同的包。這是一小部分需要擔心的代碼,通常您可以依賴修改代碼的人仔細閱讀同一包中其他類中的註釋。我認爲一些測試框架可能能夠訪問私有方法(也許可以通過禁用安全管理器?),但我不知道離手。如果這很重要,我會研究測試框架。

0

爲什麼僅用於測試的代碼應該可用於生產?

1)它不驗證應用程序代碼,因爲應用程序不使用它。

2)使用它的類的客戶端容易出錯。

3)它增加了代碼的可維護性和可讀性。
例如,開發人員可能會想知道爲什麼此方法在應用代碼中沒有調用者時存在。 考慮到它是死代碼,他可以刪除該方法並刪除使用它的單元測試。

爲了解決您的問題,我認爲非生產環境中需要的這種方法應該包含在非生產環境中的應用程序包裝中,但應該從生產環境中的包裝中排除。
作爲Maven和Gradle的工具很好地處理了這個需求。

實際上,您不能這樣做,因爲該方法構成生產中所需的類的一部分。所以,第一步就是在特定的類中提取用於測試目的的方法。
以這種方式,過濾它是可能的。

相關問題