2016-02-29 66 views
0

我想將命令行參數傳遞給具有Junit測試註釋的Java類,這可能嗎?是否有可能在同一個類中使用@Before和@Test方法的主要方法? Java

例子:

@Before 
public void before(String a, String b) { 
    // some processing 
} 

@Test 
public void test() { 

} 

public static void main(String[] args) { 

if (args[0] != null) 
    DEFAULT_CONTENT_DIR = args[0]; 

if (args[1] != null) 
    DEFAULT_FONTS_DIR = args[1]; 

if (args[2] != null) 
    formMLDir = args[2]; 

before(DEFAULT_CONTENT_DIR, DEFAULT_FONTS_DIR); 

} 

是這樣的可能嗎?

+0

一般的單元測試方法不是從'main'方法調用,但是也許如果你能解釋一下你正在努力實現有可能是什麼一個更好的方法來做到這一點。 – sprinter

+0

我想運行兩個有共生關係的課程。第1類產生第2類消耗並驗證它的輸出文件。所以我需要有一個before方法來完成我的設置和一個驗證輸出的單元測試方法。我在生產Linux環境中將它們部署爲罐子,因此測試數據將根據盒子而有所不同。所以我需要能夠將命令行參數傳遞給before方法(它運行class1),以便它知道從何處獲取生產測試數據。我希望我提供了足夠的上下文 –

+0

說實話,我不認爲這是一個很好的JUnit用例。它專爲單元測試而設計,其中與外部類的關係不是非常簡單就是模擬。我建議你看看集成測試框架。 – sprinter

回答

4

可能嗎?是。你想要什麼?可能不會。

public class CustomeMain { 

    public static void main(String [] args) { 
     customSetup(args); 
     JUnitCore.main(new String [] {"SomeTest"}); 
    } 

} 

問題是幾乎沒有人實際調用JUnit自己。他們使用Ant,Maven,Eclipse或其他一些構建工具。如果是這種情況,那麼你的自定義主要方法將不會被調用。

此外,儘管有上述評論,但這種類型的測試本質上並不是壞事,但是如果可能的話,它是很好的避免,但只有當你可以重寫你的應用程序以避免複雜的交互時。如果您不能重寫它,請不要跳過測試交互。如果有人給你悲傷,告訴他們這是一個集成測試,你正在使用JUnit作爲你的集成測試框架。

可能最簡單的解決方案是使用環境變量或JVM屬性。任何一半體面的構建工具都會爲你提供這種方法。擺脫的主要方法,改變你之前的方法來...

@Before 
public void before() { 
    String contentDir = System.getenv("CONTENT_DIR"); 
    if (contentDir == null) { 
     contentDir = DEFAULT_CONTENT_DIR; 
    } 

    //... 
} 
相關問題