2014-11-05 125 views
1

我爲我的應用程序創建了多個測試用例,所有這些測試用例都鏈接在一個測試套件類中。JUnit 4:測試用例返回測試套件中其他測試中使用的對象

但是,我想將第一個測試中創建的對象傳遞給其他人。

爲了更清楚起見,第一個測試測試了一個類,該類使用來自我的數據庫的數據創建了一個複雜的對象。我希望其他人測試對象本身的方法。

這是我如何定義我的測試套件類:

package tests.testSuites; 

import tests.Test1; 
import tests.Test2; 
import org.junit.runner.RunWith; 
import org.junit.runners.Suite; 
import org.junit.runners.Suite.SuiteClasses; 

@RunWith(Suite.class) 
@SuiteClasses({ 
    Test1.class 
    Test2.class 
}) 
public class DataTestSuite {  
} 

不過,我想有這樣的地方:

MyObject obj=Test1.testcreation(); 
Test2.testMethod(obj); 

我如何可以結合一個普通的JUnit TestSuite類的定義與是否需要將創建的對象傳遞給我的其他測試?

編輯

的信息,測試套件是在測試運行器類推出。該類有助於格式化結果並創建自定義日誌文件。

這是怎麼調用的測試套件:

public class MetExploreTestRunner { 

    public static void main(String[] args) { 

     Result result=JUnitCore.runClasses(DataTestSuite.class); 
     if(result.wasSuccessful()){ 
      System.out.println("All tests succesful "); 
     }else{ 
      for(Failure failure:result.getFailures()){ 
       System.out.println(failure.toString()); 
      } 

     } 

    } 
} 
+1

也許你應該嘗試使用@Parametrized註釋 - http://junit.sourceforge.net/javadoc/org/junit/runners/Parameterized.html? – BlueLettuce16 2014-11-05 09:33:04

+2

如果您不重新創建用於測試每個測試的對象,那麼創建依賴於順序的測試(因爲之前的測試可能已改變對象的狀態)會有風險。更好地爲我相信的每個測試創建測試對象。 – 2014-11-05 09:34:32

+0

@ErwinBolwidt:這很好。在這種情況下,應該使用註解來創建對象。但是,如果您從數據庫獲取對象,則不再是單元測試,而是集成測試。 – BlueLettuce16 2014-11-05 09:35:40

回答

1

經過在互聯網上搜索了很多,我發現我在找什麼。

庫JExample允許您創建不同測試之間的依賴關係,並在它們之間傳遞我所需要的參數。 http://scg.unibe.ch/research/jexample

我真的推薦它。

謝謝大家對你的答案

1

不要那樣做。每個測試都應該獨立於其他測試。然後您可以單獨運行測試,進行調試,並且每個測試都更易於理解。此外,JUnit以任意順序運行測試;您不能保證該對象在使用之前將被創建。

如果有多個測試使用類似的對象,請考慮將代碼創建爲測試類的共享私有方法。如果許多測試使用該對象,請考慮將其設置爲由@before方法設置的測試夾具。

0

您可以使用@Rule,而不是將一些數據從一個測試重用到其他測試。您可以在此處看到一個示例:https://github.com/junit-team/junit/wiki/Rules

該規則可以創建該大對象,然後您可以在每個想要的測試中使用該對象。

我不建議您在測試之間創建任何依賴關係,因爲事情未來可能會發生變化,您必須在其他測試中更改很多內容。

如果你真的想這樣做,你說什麼,有一個註釋@DependsOn這將是有用的,你

0

看來你在做集成測試,而不是單元測試。

你可以做的是:

  1. 創建連接到數據庫,並創建這個複雜的對象
  2. 寫一個新的類,將運行所有測試,將創建一個實例模擬類的模擬類(這可能是有幫助的http://www.tutorialspoint.com/junit/junit_suite_test.htm
  3. 使用@BeforeClass註釋創建方法將獲得此對象。
  4. 運行你的測試。

我的觀點是它不是很實用,而不是單元測試。單元測試應該是獨立的,不要依賴其他測試。

+0

我實際上有一個testrunner類,它啓動測試套件並將結果記錄在適當的文件中,但我不知道如何將創建的對象傳遞給runner中的測試類。 – Ben 2014-11-05 10:22:18

0

爲什麼不把MyObject的創建分解成實用程序類?

public class Test2{ 
    ... 
    @Test 
    public void testMethod(){ 
     MyObject obj = TestUtil.createMyObject(); 

     //do test here 

    } 


} 

然後,您可以從任何測試中致電TestUtil.createMyObject()。另外,如果創建MyObject代價昂貴,則可以懶洋洋地創建它並緩存結果,或者使用對工廠方法有用的其他任何模式。