随笔 - 117  文章 - 72  trackbacks - 0

声明:原创作品(标有[原]字样)转载时请注明出处,谢谢。

常用链接

常用设置
常用软件
常用命令
 

订阅

订阅

留言簿(7)

随笔分类(130)

随笔档案(123)

搜索

  •  

积分与排名

  • 积分 - 154453
  • 排名 - 389

最新评论

[标题]:[原]深入JUnit4.x
[时间]:2009-7-5
[摘要]:JUnit4.x参数化测试、私有方法测试、测试套件
[关键字]:JUnit、Test、测试、单元测试、addTest not applicable、suite、套件、参数化测试、私有方法、private、反射、断言
[环境]:JUnit4.5、MyEclipse7
[作者]:Winty (wintys@gmail.com) http://www.blogjava.net/wintys

[正文]:
测试目标类:
Calculator.java:
package wintys.junit;

/**
 *
 * @author Winty (wintys@gmail.com) http://www.blogjava.net/wintys/
 * @version 2009-07-05
 */
public class Calculator {
    /**
     * 加法
     * @param a
     * @param b
     * @return a与b的和
     */
    public int add(int a , int b){
        return a + b;
    }
    
    /**
     * 减法,访问权限设为private
     * @param a
     * @param b
     * @return a与b的差
     */
    private int sub(int a , int b){
        return a - b;
    }
}

简单测试
CalculatorTest.java:
package wintys.junit;

import junit.framework.Assert;

import org.junit.Before;
import org.junit.Test;

public class CalculatorTest {
    Calculator cal;

    @Before
    public void setUp() throws Exception {
        cal = new Calculator();
    }
    
    @Test
    public void testAdd(){
        int result = cal.add(1, 1);
        Assert.assertEquals(2 , result);
    }
}

参数化测试CalculatorTestWithParameter.java:
package wintys.junit;

import java.util.Arrays;
import java.util.Collection;

import static org.junit.Assert.assertEquals;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;

/**
 * JUnit4参数化测试
 * @author Winty (wintys@gmail.com) http://www.blogjava.net/wintys/
 * @version 2009-07-05
 */
@RunWith(Parameterized.class)
public class CalculatorTestWithParameter {
    private int input1;
    private int input2;
    private int result;
    
    public CalculatorTestWithParameter(int input1, int input2, int result) {
        super();
        this.input1 = input1;
        this.input2 = input2;
        this.result = result;
    }
    
    @Parameters
    public static Collection<Object[]> initParam(){
        Object[][] objArray = new Object[][]{
                {1 , 1 , 2},
                {2 , 5 , 7},
                {-1 , 8 , 7},
                {-5 , -1 ,-6}
        };
        
        return Arrays.asList(objArray);
    }
    
    @Test
    public void testAdd(){
        Calculator cal = new Calculator();
        int rt = cal.add(input1, input2);
        
        assertEquals(result , rt);
    }
}


测试私有方法CalculatorTestOfPrivate.java:
package wintys.junit;

import java.lang.reflect.Method;

import junit.framework.Assert;

import org.junit.Before;
import org.junit.Test;

/**
 * JUnit4测试private方法
 * @author Winty (wintys@gmail.com) http://www.blogjava.net/wintys/
 * @version 2009-07-05
 */
public class CalculatorTestOfPrivate {
    Calculator cal;

    @Before
    public void setUp() throws Exception {
        cal = new Calculator();
    }
    
    @Test
    public void testPrivateMethod(){
        Class<Calculator> cls = Calculator.class;
        Method method = null;
        Object result = 0 ;
        try {
            method = cls.getDeclaredMethod("sub", new Class<?>[]{int.class,int.class});
            method.setAccessible(true);
            result = (Object)method.invoke(cal, 1 , 2);
            
            Assert.assertEquals(-1, result);
        } catch (Exception e) {
            e.printStackTrace();
            Assert.fail();
        }     
        
    }

}


建立测试套件AllTests.java:
package wintys.junit;

import org.junit.runner.RunWith;
import org.junit.runners.Suite;
import org.junit.runners.Suite.SuiteClasses;

/**
 * JUnit4 Test Suite Style
 * @author Winty (wintys@gmail.com) http://www.blogjava.net/wintys/
 * @version 2009-07-04
 */
//表示这个类是一个测试套件
@RunWith(Suite.class)
//说明这个测试套件所包含的测试类
@SuiteClasses({
    SubscriptionTest.class,
    CalculatorTest.class,
    CalculatorTestWithParameter.class,
    CalculatorTestOfPrivate.class
})
public class AllTests {
    //在JUnit4.x中,套件类的内容一般留空,只作为以上Annotation的持有者
    // the class remains completely empty,
    // being used only as a holder for the above annotations
}



附录:
JUnit3.8.x测试套件语法:
package test;

import test.gg.ba.util.UtilityTest;
import junit.framework.Test;
import junit.framework.TestSuite;

public class MyTests {
    public static Test suite() {
        TestSuite suite = new TestSuite("Test for test");
        //$JUnit-BEGIN$

        suite.addTest(test.gg.ba.util.UtilityTest.class);

        //$JUnit-END$
        return suite;
    }
}


在JUnit4中运行JUnit3.8.x的测试套件,
Runner for use with JUnit 3.8.x-style:
@RunWith(AllTests.class)
 public class ProductTests {
    public static junit.framework.Test suite() {
       ...
    }
 }


[参考资料]:
[1] Test suites using annotations  : http://radio.javaranch.com/lasse/2006/07/27/1154024535662.html
[2] JUnit 4 Test Suite - addTest not applicable : http://www.velocityreviews.com/forums/t636846-junit-4-test-suite-addtest-not-applicable.html

[附件]:
源程序:http://www.blogjava.net/Files/wintys/junit_test.zip

原创作品,转载请注明出处。
作者:Winty (wintys@gmail.com)
博客:http://www.blogjava.net/wintys

posted on 2009-07-08 10:28 天堂露珠 阅读(1592) 评论(0)  编辑  收藏 所属分类: Test

只有注册用户登录后才能发表评论。


网站导航: