`

[原]深入JUnit4.x

阅读更多

[标题]:[原]深入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

 

分享到:
评论

相关推荐

    浪曦][原创]Junit.3.8.详解续二.rar

    Junit 3.8是较早的版本,虽然现在最新的版本是Junit 5,但许多项目仍基于Junit 3.x运行。 2. **注解(Annotations)**:在Junit 3.8中,注解尚未被引入,所以测试类和方法通常使用`public static void testXXX()`的...

    spring文档4.3.x版本

    文档中还会详细讲述如何使用Log4j 1.2或2.x,避免使用Commons Logging,以及如何在Spring应用中通过SLF4J与Log4j或Logback结合使用,还有如何使用Java的原生日志库JUL(java.util.logging)。此外,文档还提供了对...

    官方原版完整包 spring-framework-5.2.14.RELEASE-dist.zip

    10. **XML与注解配置**:Spring支持XML配置和注解配置两种方式,5.2.x版本中,注解配置更加普及,使得代码更加简洁,减少了XML配置的繁琐。 通过这些知识点,我们可以了解到Spring Framework 5.2.14.RELEASE是如何...

    starter_flutter_vertx_源码.zip

    7. **测试与调试**:Flutter提供丰富的测试框架如`test`和`flutter_test`,而Vert.x可以通过JUnit或其他单元测试框架进行后端测试。此外,使用像Postman这样的工具可以方便地测试HTTP接口。 8. **部署与监控**:...

    BRMS6:版本BRMS 6.x.xx的示例和测试

    3. **工作流示例**:如果BRMS 6.x.xx支持工作流管理,那么可能会有KIE工作流(原JBOSS jBPM)的示例,展示如何设计和执行复杂的业务流程。 4. **测试脚本**:这些脚本用于验证规则和工作流的正确性。它们可能使用...

    jdk-8u321-windows-x64.exe

    《深入解析Java开发环境JDK 8u321在Windows平台的应用》 Java Development Kit(JDK)是Oracle公司发布的用于开发和运行Java应用程序的重要工具集,它为程序员提供了编写、编译、调试和运行Java程序所需的一切。在...

    robotium实例

    这个类需要继承`androidx.test.ext.junit.runners.AndroidJUnit4`,并使用Robotium提供的Solo类进行测试操作。例如: ```java import androidx.test.ext.junit.runners.AndroidJUnit4; import ...

    BookStore-App-In-Play:玩中的Bookstore应用2.5.x

    **书架应用在Play框架2.5.x中的实现** ...通过深入研究这些文件和目录,我们可以更深入地了解这个Bookstore应用的实现细节和架构设计。学习并理解这个项目,对于掌握Play框架以及构建基于Java的Web应用具有很高的价值。

    基于Android的X光片管理系统源码数据库.zip

    该压缩包文件“基于Android的X光片管理系统源码数据库.zip”显然包含了用于构建一个X光片管理系统的完整源代码和可能的数据库配置。这个系统可能是为了帮助医疗机构或者医院有效地管理和检索患者的X光片数据。以下是...

    张冰struts原代码(全部1-6)之五

    4. **Tiles**:在Struts 1.x中,Tiles扩展允许开发者创建可重用的页面布局,通过定义模板和组合多个组件来构建复杂的视图。这提高了UI设计的效率和一致性。 5. **国际化和本地化**:Struts支持多语言环境,通过资源...

    Cocoa Programming For Mac OS X 3rd Edition高清中文翻译版(仅十八章,附原码)

    《Cocoa Programming for Mac OS X》是Mac OS X平台下进行Cocoa开发的经典教程,第3版更是深入浅出地介绍了Cocoa框架的各个方面。这个高清中文翻译版虽然只包含了原书的18章,但对于初学者和有一定基础的开发者来说...

    Android-Kotlin基于优秀Scalatest的测试框架

    为了在Android环境中运行这些测试,我们需要配置Android测试框架,例如JUnit4或AndroidX Test。然后,可以使用`@RunWith`注解指定Scalatest的运行器,例如`io.kotlintest.runner.junit4.KotlinTestRunner`。同时,还...

    CocoaProgram:苹果开发之Cocoa编程(用于Mac OS X的Cocoa编程)(原书第四版)源代码

    "CocoaProgram:苹果开发之Cocoa编程(用于Mac OS X的Cocoa编程)(原书第四版)源代码"是针对这一主题的一本教材的源码实现,通过学习和实践这些源码,开发者可以深入了解Cocoa框架的工作原理以及如何有效地利用它...

    王超 - 金融行业DevOps实践.zip

    《王超 - 金融行业DevOps实践》这本书深入探讨了DevOps在金融行业中的实际应用与挑战。DevOps,即开发(Development)与运维(Operations)的融合,旨在通过自动化流程促进软件开发、测试和部署的高效协同,提高软件...

    安卓 问卷调查Demo 原生代码

    4. **数据验证**:在用户填写问卷后,可能需要对答案进行验证,确保其符合预期格式或选择。这可以通过自定义验证函数实现,检查输入是否为空、格式是否正确等。 5. **存储和处理数据**:问卷的答案需要被存储,以便...

    Android高级应用源码-高仿乐动力体重设置.rar

    1. **用户界面设计**:高仿意味着开发者需要对原应用的界面布局、颜色搭配、图标设计等有深入研究,确保新应用与原应用在视觉上保持一致。这涉及到Android的`XML`布局文件,如`activity`和`fragment`的定义,以及`...

    Android外文翻译

    翻译可能包含了从Android 2.x到最新的Android 12的各种版本特性,如Material Design设计语言的进化、性能优化、隐私控制的加强等。 4. **安全与隐私** 随着用户对数据安全和隐私的关注度提高,Android系统也在不断...

    Android-System-Development_JAVA.pdf.zip_android

    15. **版本兼容性**:Android系统存在众多版本,开发者需要考虑API级别的兼容问题,使用Support Library或AndroidX库来支持旧版本设备。 通过深入学习以上知识点,并结合实际项目经验,开发者可以掌握Java在Android...

Global site tag (gtag.js) - Google Analytics