2012-08-16 71 views
0

這裏JUnit測試是一個單元測試類:與參數化方法

MyUnitTestSetup myUnitTestSetup ; 

public void setUp(String myParam){ 
    myUnitTestSetup = new MyUnitTestSetup(myParam); 
} 

@Test 
public void test1(){ 
    setUp("value1"); 
    //do some stuff with myParam = "value1"; 
} 

@Test 
public void test2(){ 
    setUp("value2"); 
    //do some stuff with myParam = "value2"; 
} 

我想與「VALUE1」和TEST2用「VALUE2」執行TEST1。參數化單元測試是不是方便,因爲它們將執行測試1的「值1」和「值2」和TEST2的「值1」和「值2這是不是我想要的

我雖然約:

  • 通話使用@rule標註每一次我做一個測試的設置方法
  • static String myParam; 
    MyUnitTestSetup myUnitTestSetup ; 
    
    @Before 
    public void setUp(){ 
        myUnitTestSetup = new MyUnitTestSetup(myParam); 
    } 
    
    @Rule 
    public TestRule rule = new TestRule() {  
        @Override 
        public Statement apply(final Statement base, final Description desc) { 
         return new Statement() { 
          @Override 
          public void evaluate() throws Throwable { 
           if(desc.getMethodName().equals("test1")) 
            myParam = "value1"; 
           ... 
          } 
         }; 
        } 
    } 
    
    @Test 
    public void test1(){ 
        //do some stuff with myParam = "value1"; 
    } 
    
    @Test 
    public void test2(){ 
        //do some stuff with myParam = "value2"; 
    } 
    

但我想知道是否有更清潔&更聰明的方式。我會想到類似的東西:

MyUnitTestSetup myUnitTestSetup ; 

@Before 
public void setUp(String myParam){ 
    myUnitTestSetup = new MyUnitTestSetup(myParam); 
} 

@Test(myParam="value1") 
public void test1(){ 
    //do some stuff with myParam = "value1"; 
} 

@Test(myParam="value2") 
public void test2(){ 
    //do some stuff with myParam = "value2"; 
} 

有什麼想法嗎?

+0

我寫了一個庫名爲參數化,除其他事情,讓你用'@ OnlyIf'或'@ OnlyIfNot'註釋測試做到這一點。不幸的是,我從來沒有得到記錄的東西......但隨時去看看:https://code.launchpad.net/namedparameterizedrunner – yshavit 2012-08-16 18:48:36

+0

可能是這會幫助你http://netbeans.dzone.com/articles/junit-little-beyond-test-after?page = 0, – 2012-08-16 18:53:31

回答

3

我在這裏錯過了什麼嗎?爲什麼不把它設置爲測試調用中的第一件事,或者調用設置方法。

@Test 
public void test1(){ 
    myParam = "value1"; //set the value? 
    ... 
} 

@Test 
public void test2(){ 
    setupMyParam("value2"); // or this? 
    ... 
} 
+0

這正是我在第一個例子中所做的。但我想知道是否有更清潔的東西存在。例如,如果您需要設置沒有任何參數的測試,您可以在使用@Before註釋的外部方法中執行此操作。您不會在每種測試方法的第一行中調用它... – JBE 2012-08-17 08:02:21

0

不知道如果使用TestNG是一個選擇,但是如果可以的話,直接TestNG的可以讓你1)傳遞參數的測試方法和2)你每班要定義爲許多數據提供商。例如:

@DataProvider 
public Object[][] dp1() { 
    return new Object[][] { 
     new Object[] { "value1"}; 
    } 
} 

@Test(dataProvider = "dp1") 
public void test1(String value) { 
    // will receive "value1" 
} 

@DataProvider 
public Object[][] dp2() { 
    return new Object[][] { 
     new Object[] { "value2"}; 
    } 
} 

@Test(dataProvider = "dp2") 
public void test2(String value) { 
    // will receive "value2" 
} 
0

看看JUnitParams庫。有了它,你可以這樣做:

@Test 
@Parameters({ new MyUnitTestSetup("value1") }) 
public void test1(MyUnitTestSetup myUnitTestSetup1) { 
    // do some stuff with myUnitTestSetup1 
} 

@Test 
@Parameters({ new MyUnitTestSetup("value2") }) 
public void test2(MyUnitTestSetup myUnitTestSetup2) { 
    // do some stuff with myUnitTestSetup2 
}