2012-08-16 74 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 
}