JUnit设计模式分析
Junit4单元测试框架的常用方法介绍

Junit4单元测试框架的常⽤⽅法介绍Junit 介绍:Junit是⼀套框架(⽤于JAVA语⾔),由 Erich Gamma 和 Kent Beck 编写的⼀个回归测试框架(regression testing framework),即⽤于⽩盒测试。
本⽂介绍的内容:1 Junit Myeclipse测试类的⽣成2 JUnit 4 常⽤的⼏个annotation 介绍与使⽤ (@Before @After @Test @Ignore @BeforeClass @AfterClass)3 常⽤的断⾔介绍4 特殊的处理(限时测试,异常测试)5 参数化配置(@Parameters)准备测试代码测试的⽅法(正确、错误⽅法、死循环、抛异常)LogicServicepackage com.logic;public class LogicService {public int add(int x ,int y){ //加法return x+y;}public int sub(int x ,int y){ //减法return x-y;}public int div(int x ,int y){ //除法return x/y;}public int div2(int x ,int y){ //除法做了异常判断try {int z = x/y;} catch (Exception e) {e.printStackTrace();}return x/y;}public void loop(int x ,int y){ //死循环for(;;)x=y;}public void unCompleted(int x ,int y){ //未完成的模块//还在开发中}}⼀ Myeclipse测试类的⽣成1 对需要测试的类点右键 NEW ⼀个Junit Test Case2 点击NEXT注意 1 选择NEW Junit 4 test2 source folder 是默认会填写上之前右键NEW的那个类,如果不是的话,请⾃⾏进⾏修改3 package 默认会填写当前的包名个⼈建议重新开个测试包-即在包后⾯加上.test 表⽰是单元测试⽤例专⽤包与源代码分离4 name 默认会在之前右键NEW的那个类的基础的后⾯加上Test 如果不是的话,建议⾃⾏进⾏修改,便于标⽰5 初始化的⽅法,我⼀般会勾上个setUp,这个请随意。
junit测试实验报告

junit测试实验报告JUnit测试实验报告简介:JUnit是一种用于Java编程语言的测试框架。
它提供了一种简单而有效的方式来编写和运行测试代码,以确保软件的正确性。
在本实验中,我们将介绍JUnit 的基本概念和使用方法,并通过实际案例来展示其应用。
一、什么是JUnit?JUnit是一个开源的Java测试框架,用于编写和运行可重复的自动化测试。
它提供了一套用于测试代码的API,并支持各种断言和异常处理机制。
JUnit的主要目标是提高软件开发的效率和质量,通过自动化测试来减少人工测试的工作量,同时提供可靠的测试结果。
二、为什么使用JUnit?1. 提高开发效率:JUnit可以自动运行测试代码,并提供详细的测试报告,帮助开发人员快速定位和修复问题。
2. 简化测试过程:JUnit提供了一套简单的API,使得编写测试代码变得更加容易和直观。
3. 增强代码质量:通过编写全面的测试用例,可以有效地发现和修复潜在的bug,提高代码的健壮性和可靠性。
三、JUnit的基本使用方法1. 引入JUnit库:在项目的构建文件中添加JUnit的依赖,例如在Maven项目中,在pom.xml文件中添加JUnit的依赖项。
2. 编写测试类:创建一个新的Java类,并使用@Test注解来标记测试方法。
测试方法应该具有独立性,不依赖于其他方法或外部资源。
3. 运行测试:使用JUnit提供的测试运行器来执行测试代码。
可以选择在IDE中直接运行测试类,或者使用构建工具(如Maven或Gradle)来执行测试。
4. 断言和异常处理:使用JUnit提供的断言方法来验证预期结果和实际结果是否一致。
同时,可以使用@ExpectedException注解来测试方法是否会抛出指定的异常。
四、案例演示假设我们要编写一个简单的计算器类Calculator,其中包含加法和减法两个方法。
我们可以使用JUnit来编写测试用例,以验证这两个方法的正确性。
eclipse中Junit的配置

Eclipse中的JUnit环境配置实例一、简介JUnit是一款由Erich Gamma(《设计模式》的作者)和Kent Beck(极限编程的提出者)编写的开源的回归测试框架,供Java编码人员做单元测试之用。
当前版本4.1,可以从网站上获得。
与早期的JUnit 3相比,JUnit 4.1依赖于Java 5.0的新特性,因此无法兼容于jdk 1.4,可以说是一个全新的框架。
由于这里使用的IDE是Eclipse 3.2.1加语言包,已经集成了junit 4.1,因此便免去下载和配置类库的麻烦了^_^二、创建项目下面打开Eclipse,点击菜单“文件”->“新建”->“项目”或“新建”按钮,打开“新建”对话框:请选中“Java项目”,点击“下一步”,进入“新建Java项目”对话框:在这个对话框中需要设置项目的名称以及项目所在目录,我为自己的项目起名为JUnitTest,目录为F:\YPJCCK\JUnit\Eclipse\JUnitTest。
由于Eclipse自带了JUnit类库,因此此时点击“完成”即可。
三、编写用于测试的JavaBean用于测试的JavaBean很简单,名为Book,只有id和name两个属性,这两个属性将分别用于两个用例当中。
下面开始编写该JavaBean。
请点击“文件”->“新建”->“类”,打开“新建Java类”对话框,设置包为net.test.unit.junit,名称为Book,并确保“public static void main(String[] args)”选项没有选中,然后点击“完成”。
修改代码如下:package net.test.unit.junit;public class Book {private String id = null;private String name = null;public String getId() {return id;}public void setId(String id) {this.id = id;}public String getName() {return name;}publicvoid setName(String name) { = name;}}至此,用于测试的JavaBean编写完成。
使用JUnit进行代码测试

使用JUnit进行代码测试在软件开发过程中,代码测试是一个关键的环节,它可以帮助我们发现代码中存在的问题,并及时修复,从而提高软件的质量。
然而,传统的手动测试方式需要耗费大量的时间和人力,而使用JUnit进行代码测试则可以自动化测试过程,提高测试效率。
JUnit是基于Java语言的一个开源测试框架,它主要用于编写和运行单元测试。
在JUnit中,我们可以通过编写测试用例对程序的各个部分进行测试,从而验证代码的正确性和鲁棒性。
下面,我们来看一下如何使用JUnit进行代码测试。
1. 添加JUnit库首先,我们需要在项目中添加JUnit库。
在Eclipse中,可以通过如下步骤添加JUnit库:1) 右键单击项目名称,选择“Build Path” -> “Configure Build Path”。
2) 选择“Libraries”选项卡,点击“Add Library”按钮。
3) 选择“JUnit”库,点击“Next”按钮。
4) 选择JUnit版本,点击“Finish”按钮。
2. 编写测试用例在JUnit中,每个测试用例都是由一个或多个测试方法组成的。
测试方法以@Test注解标记,表示这是一个测试方法。
下面是一个简单的测试用例:import static org.junit.Assert.assertEquals;import org.junit.Test;public class MyTest {@Testpublic void testAdd() {int a = 1;int b = 2;assertEquals(3, a + b);}}在测试用例中,我们可以使用JUnit提供的断言方法进行测试,比如assertEquals()方法用于判断实际值是否等于期望值。
3. 运行测试用例当我们编写好测试用例后,就可以运行测试用例了。
在Eclipse 中,可以通过右键单击测试用例所在类的名称,选择“Run As” -> “JUnit Test”来运行测试用例。
junit心得体会

junit心得体会篇一:JUNIT心得体会篇一:我本人学习junit的心得体验我本人学习junit的心得体验其实促使我学习junit首先是因为它是一个标准。
其实不用junit进行测试可不可以呢?答案是可以的,而且我们还可以随心所欲地编写测试代码,到最后轻松完成测试。
但是问题出现了,如果有人接下你的项目进行二次开发的时候,看你的测试代码将是一件苦差事。
所以有必要制定一套标准实现测试的规范化。
junit在这种环境之下诞生了。
其次,通过学习junit,我感受到了先写测试再编码的好处。
因为在我们写好测试的同时,我们也确认了类别所要进行的行为,即使我们一开始对该类别的职责还不明确,藉由先写下测试,我们对该类别的要求也可以确定下来,这是写测试的好处,而且在写好的同时,相当于也写好了对该类别的职责说明书。
因此我们应该先将相关的测试写好,这可以帮助我们确定所要加上的功能是什么,然后我们的目标就是通过这些新的测试。
事实上,我们的类别将会被设计为与其它物件耦合度低的类别,这也是先写测试所意外带来的好处。
其实junit简单使用并不复杂,首先要下载junit包并配置好,我用的ide是netbeans里面已经集成junit了。
一般一个类别都会对应一个测试类。
junit提供了一个代码框架给我们编写我们自己的测试类:public class testxxx extends testcase{public testxxx(string name){super(name);}public void setup(){try {();/*your initialize code here*/} catch (exception ex) {();}}public void teardown(){try {/*your destroy code here*/();} catch (exception ex) {();}}public void testxxx(){}}让我们分析这个框架代码吧。
java编程之单元测试(Junit)实例分析(附实例源码)

java编程之单元测试(Junit)实例分析(附实例源码)本⽂实例讲述了java编程之单元测试。
分享给⼤家供⼤家参考,具体如下:完整实例代码代码点击此处。
在有些时候,我们需要对我们⾃⼰编写的代码进⾏单元测试(好处是,减少后期维护的精⼒和费⽤),这是⼀些最基本的模块测试。
当然,在进⾏单元测试的同时也必然得清楚我们测试的代码的内部逻辑实现,这样在测试的时候才能清楚地将我们希望代码逻辑实现得到的结果和测试实际得到的结果进⾏验证对⽐。
废话少说,上代码:⾸先创建⼀个java⼯程,在⼯程中创建⼀个被单元测试的Student数据类,如下:package com.phicomme.hu;public class Student{private String name;private String sex;private int high;private int age;private String school;public Student(String name, String sex ,int high, int age, String school){ = name;this.sex = sex;this.high = high;this.age = age;this.school = school;}public String getName(){return name;}public void setName(String name){ = name;}public String getSex(){return sex;}public void setSex(String sex){this.sex = sex;}public int getHigh(){return high;}public void setHigh(int high){this.high = high;}public int getAge(){return age;}public boolean setAge(int age){if (age >25){return false;}else{this.age = age;return true;}}public String getSchool(){return school;}public void setSchool(String school){this.school = school;}}在eclipse下单元测试这个类:⾸先导⼊Junit包:选中java⼯程,点击⿏标右键--->选择properties---->在窗⼝中选Java Build Path---->在右侧点击Add Library---->在弹出的窗⼝列表中选中Junit---->下⼀步----->Junit 4(我⽤的是Junit 4)---->finish这样Junit 4包就导完了,接下来就是创建测试类:将测试类和被测试类放在不同的包中(也可以放在同⼀个包中,此处只是为了区别),代码如下:测试类1:package com.phicomme.test;import com.phicomme.hu.Student;import junit.framework.TestCase;public class StudentTest01 extends TestCase{Student testStudent;//此⽅法在执⾏每⼀个测试⽅法之前(测试⽤例)之前调⽤@Overrideprotected void setUp() throws Exception{// TODO Auto-generated method stubsuper.setUp();testStudent = new Student("djm", "boy", 178, 24, "华东政法");System.out.println("setUp()");}//此⽅法在执⾏每⼀个测试⽅法之后调⽤@Overrideprotected void tearDown() throws Exception{// TODO Auto-generated method stubsuper.tearDown();System.out.println("tearDown()");}//测试⽤例,测试Person对象的getSex()⽅法public void testGetSex(){assertEquals("boy", testStudent.getSex());System.out.println("testGetSex()");}//测试Person对象的getAge()⽅法public void testGetAge(){assertEquals(24, testStudent.getAge());System.out.println("testGetAge()");}}测试类2:package com.phicomme.test;import junit.framework.TestCase;import com.phicomme.hu.Student;public class StudentTest extends TestCase{private Student testStudent;@Overrideprotected void setUp() throws Exception{// TODO Auto-generated method stubsuper.setUp();testStudent = new Student("steven_hu", "boy", 170 , 23, "上海理⼯");}@Overrideprotected void tearDown() throws Exception{// TODO Auto-generated method stubsuper.tearDown();}public void testSetage(){assertTrue(testStudent.setAge(21));}public void testGetSchool(){//预期值和实际值不⼀样,测试时出现失败(Failure)assertEquals("南昌⼤学", testStudent.getSchool());}public void testGetName(){assertEquals("hdy", testStudent.getName());}}当然,如果同时需要⼀起测试以上这两个测试类,可以通过TestSuite类实现,它相当于是⼀个套件,可以把所有测试类添进来⼀起运⾏测试;代码如下:package com.phicomme.test;import com.phicomme.hu.StudentTest02;import junit.framework.Test;import junit.framework.TestSuite;public class AllTest{//static PersonTest p = new PersonTest();//static PersonTest p1 = new PersonTest();public static Test suite(){TestSuite suite = new TestSuite("Test for com.phicomme.test");//suite.addTest(p);//suite.addTest(p1);suite.addTestSuite(StudentTest.class);suite.addTestSuite(StudentTest01.class);return suite;}}最后,分别测试以上三个类(选中需要测试的类---->⿏标右键---->Run As---->Junit Test):StudentTest类的测试结果图:StudentTest01类的测试结果图:AllTest类的测试结果图:有关java的测试就讲到这⾥,希望对⼤家有帮助,有时间也会接着讲讲有关android的单元测试,和在⼿机上实现编写⼀个UI 界⾯替代eclipse如上图中的测试界⾯;希望本⽂所述对⼤家Java程序设计有所帮助。
分析 JUnit 框架源代码

分析JUnit 框架源代码理解JUnit 测试框架实现原理和设计模式2009 年5 月31 日本文细致地描述了JUnit 的代码实现,在展示代码流程UML 图的基础上,详细分析JUnit 的内部实现代码的功能与机制,并在涉及相关设计模式的地方结合代码予以说明。
另外,分析过程还涉及Reflection 等Java 语言的高级特征。
概述在测试驱动的开发理念深入人心的今天,JUnit 在测试开发领域的核心地位日渐稳定。
不仅Eclipse 将JUnit 作为默认的IDE 集成组件,而且基于JUnit 的各种测试框架也在业内被广泛应用,并获得了一致好评。
目前介绍JUnit 书籍文章虽然较多,但大多数是针对JUnit 的具体应用实践,而对于JUnit 本身的机制原理,只是停留在框架模块的较浅层次。
本文内容完全描述JUnit 的细致代码实现,在展示代码流程UML 图的基础上,详细分析JUnit 的内部实现代码的功能与机制,并在涉及相关设计模式的地方结合代码予以说明。
另外,分析过程还涉及Reflection 等Java 语言的高级特征。
本文的读者应该对JUnit 的基本原理及各种设计模式有所了解,主要是面向从事Java 相关技术的设计、开发与测试的人员。
对于C++,C# 程序员也有很好的借鉴作用。
回页首Junit 简介JUnit 的概念及用途JUnit 是由Erich Gamma 和Kent Beck 编写的一个开源的单元测试框架。
它属于白盒测试,只要将待测类继承TestCase 类,就可以利用JUnit 的一系列机制进行便捷的自动测试了。
JUnit 的设计精简,易学易用,但是功能却非常强大,这归因于它内部完善的代码结构。
Erich Gamma 是著名的GOF 之一,因此JUnit 中深深渗透了扩展性优良的设计模式思想。
JUnit 提供的API 既可以让您写出测试结果明确的可重用单元测试用例,也提供了单元测试用例成批运行的功能。
junit实验报告

junit实验报告《Junit实验报告》在软件开发过程中,测试是非常重要的一环。
而Junit作为Java语言中最流行的单元测试框架,被广泛应用在各种项目中。
本实验旨在探究Junit的基本使用方法和功能,以及其在软件开发中的重要性。
实验一:Junit的基本使用方法首先,我们学习了Junit的基本使用方法。
通过创建一个简单的Java类和对应的测试类,我们了解了如何使用Junit中的断言方法来验证代码的正确性。
在这个过程中,我们发现Junit提供了丰富的断言方法,可以满足不同类型的测试需求。
同时,Junit还提供了@Before、@After、@BeforeClass、@AfterClass等注解,可以帮助我们在测试前后进行一些准备和清理工作。
实验二:Junit的功能探究接着,我们深入探究了Junit的一些高级功能。
我们发现Junit支持参数化测试,可以让我们针对不同的输入参数进行多次测试。
此外,Junit还支持异常测试,可以帮助我们验证代码在异常情况下的行为是否符合预期。
这些功能都大大提高了我们对代码质量的信心,同时也减少了手动测试的工作量。
实验三:Junit在软件开发中的重要性最后,我们讨论了Junit在软件开发中的重要性。
通过使用Junit,我们可以快速、方便地进行单元测试,及时发现代码中的问题,并且在后续的开发过程中保证代码的稳定性。
同时,Junit还可以帮助我们编写更加可靠的代码,提高软件的质量和可维护性。
因此,Junit不仅是一种工具,更是一种开发理念,可以帮助我们构建更加健壮的软件系统。
总结通过本次实验,我们深入了解了Junit的基本使用方法和功能,以及其在软件开发中的重要性。
我们相信,在今后的软件开发过程中,Junit将会成为我们不可或缺的利器,帮助我们构建高质量的软件系统。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
JUnit设计模式分析JUnit是一个优秀的Java单元测试框架,由两位世界级软件大师Erich Gamma 和Kent Beck共同开发完成。
本文将向读者介绍在开发JUnit的过程中是怎样应用设计模式的。
关键词:单元测试JUnit 设计模式1 JUnit概述1.1 JUnit概述JUnit是一个开源的java测试框架,它是Xuint测试体系架构的一种实现。
在JUnit单元测试框架的设计时,设定了三个总体目标,第一个是简化测试的编写,这种简化包括测试框架的学习和实际测试单元的编写;第二个是使测试单元保持持久性;第三个则是可以利用既有的测试来编写相关的测试。
所以这些目的也为什么使用模式的根本原因。
1.2 JUnit开发者JUnit最初由Erich Gamma 和Kent Beck所开发。
Erich Gamma博士是瑞士苏伊士国际面向对象技术软件中心的技术主管,也是巨著《设计模式》的四作者之一。
Kent Beck先生是XP(Extreme Programmin g)的创始人,他倡导软件开发的模式定义,CRC卡片在软件开发过程中的使用,HotDraw软件的体系结构,基于xUnit的测试框架,重新评估了在软件开发过程中测试优先的编程模式。
是《The Smalltalk Best Practice Patterns》、《Extreme Programming Explained》和《Planning Extreme Programming(与Martin Fowler合著)》的作者。
由于JUnit是两位世界级大师的作品,所以值得大家细细品味,现在就把JUnit中使用的设计模式总结出来与大家分享。
我按照问题的提出,模式的选择,具体实现,使用效果这种过程展示如何将模式应用于JUnit。
2 JUnit体系架构JUnit的设计使用以Patterns Generate Architectures(请参见Patterns Generate Architectures, Kent Beck and Ralph Johnson, ECOOP 94)的方式来架构系统。
其设计思想是通过从零开始来应用设计模式,然后一个接一个,直至你获得最终合适的系统架构。
3 JUnit设计模式3.1 JUnit框架组成l 对测试目标进行测试的方法与过程集合,可将其称为测试用例。
(TestCase)l 测试用例的集合,可容纳多个测试用例(TestCase),将其称作测试包。
(TestSuite)l 测试结果的描述与记录。
(TestResult)l 测试过程中的事件监听者(TestListener)l 每一个测试方法所发生的与预期不一致状况的描述,称其测试失败元素。
(TestFailure)l JUnit Framework中的出错异常。
(AssertionFailedError)3.2 Command(命令)模式3.2.1 问题首先要明白,JUnit是一个测试framework,测试人员只需开发测试用例。
然后把这些测试用例组成请求(有时可能是一个或者多个),发送到JUnit FrameWork,然后由JUnit执行测试,最后报告详细测试结果。
其中包括执行的时间,错误方法,错误位置等。
这样测试用例的开发人员就不需知道JUnit内部的细节,只要符合它定义的请求格式即可。
从JUnit的角度考虑,它并不需要知道请求TestCase的操作信息,仅把它当作一种命令来执行,然后把执行测试结果发给测试人员。
这样就使JUnit 框架和TestCase的开发人员独立开来,使得请求的一方不必知道接收请求一方的详细信息,更不必知道是怎样被接收,以及怎样被执行的,实现系统的松耦合。
3.2.2 模式的选择Command(命令)模式(请参见Gamma, E., et al. Design Patterns: Elements of Reusable Object-Oriented Software, Addison-Wesley, Reading, MA, 1995)则能够比较好地满足需求。
摘引其意图(intent),将一个请求封装成一个对象,从而使你可用不同的请求对客户进行参数化;对请求进行排队或记录请求日志mand告诉我们可以为一个操作生成一个对象并给出它的一个execute(执行)方法。
3.2.3 实现为了实现Command模式,首先定义了一个接口Test,其中Run便是Command的Execute方法。
然后又使用Default Adapter模式为这个接口提供了缺省实现TestCase抽象类,这样我们开发人员就可以从这个缺省实现进行集成,而不必从Test接口进行实现。
我们首先来分析Test接口。
它存在一个是countTestCases方法,它来统计这次测试有多少个TestCase,另外一个方法就是我们的Command模式的Excecute方法,这里命名为run。
还有一个参数TestResult,它来统计测试结果public interface Test {/*** Counts the number of test cases that will be run by this test.*/public abstract int countTestCases();/*** Runs a test and collects its result in a TestResult instance.*/public abstract void run(TestResult result);}TestCase是该接口的抽象实现,它增加了一个测试名称,因为每一个TestCase在创建时都要有一个名称,因此若一个测试失败了,你便可识别出是哪个测试失败。
public abstract class TestCase extends Assert implements Test {/*** the name of the test case*/private String fName;public void run(TestResult result) {result.run(this);}}这样我们的开发人员,编写测试用例时,只需继承TestCase,来完成run方法即可,然后JUnit获得测试用例,执行它的run方法,把测试结果记录在TestResult之中,目前可以暂且这样理解。
3.2.4 效果下面来考虑经过使用Command模式后给系统的架构带来了那些效果:l Command模式将实现请求的一方(TestCase开发)和调用一方(JUnit Fromwork)进行解藕l Command模式使新的TestCase很容易的加入,无需改变已有的类,只需继承TestCase类即可,这样方便了测试人员l Command模式可以将多个TestCase进行组合成一个复合命令,实际你将看到TestSuit就是它的复合命令,当然它使用了Composite模式l Command模式容易把请求的TestCase组合成请求队列,这样使接收请求的一方(Junit Fromwork),容易的决定是否执行请求,或者一旦发现测试用例失败或者错误可以立刻停止进行报告l Command模式可以在需要的情况下,方便的实现对请求的Undo和Redo,以及记录Log,这部分目前在JUnit中还没有实现,将来是很容易加入的3.3 Composite(组合)3.3.1 问题为了获得对系统状态的信心,需要运行多个测试用例。
通过我们使用Command模式,JUnit能够方便的运行一个单独的测试案例之后产生测试结果。
可是在实际的测试过程中,需要把多个测试用例进行组合成为一个复合的测试用例,当作一个请求发送给JUnit.这样JUnit就为面临一个问题,必须考虑测试请求的类型,是一个单一的TestCase还是一个复合的TestCase,甚至于要区分到底有多少个TestCase。
这样Junit 框架就要完成像下面这样的代码:if(isSingleTestCase(objectRequest)){//如果是单个的TestCase,执行run,获得测试结果objectRequest.run()}else if(isCompositeTestCase(objectRequest)){//如果是一个复合TestCase,就要执行不同的操作,然后进行复杂的算法进行分//解,之后再运行每一个TestCase,最后获得测试结果,同时又要考虑//如果中间测试错误怎样????、……………………………………………………}这样JUnit必须考虑区分请求(TestCase)的类型(是单个testCase还是复合testCase),而实际上大多数情况下,测试人员认为这两者是一样的。
对于这两者的区别使用,又会使程序变得更加复杂,难以维护和扩展。
于是要考虑,怎样设计JUnit才可以实现不需要区分单个TestCase还是复合TestCase,把它们统一成相同的请求?3.3.2 模式的选择当测试调用者不必关心其运行的是一个或多个测试案例的请求时,能够轻松地解决这个问题模式就是Composite(组合)模式。
摘引其意图,将对象组合成树形结构以表示部分-整体的层次结构。
Composite使得用户对单个对象和组合对象的使用具有一致性。
在这里部分-整体的层次结构是解决问题的关键,可以把单个的TestCase看作部分,而把复合的TestCase(TestSuit)看作整体。
这样我们使用该模式便可以恰到好处得解决这个难题。
Composite模式结构Composite模式引入以下的参与者:n Component:这是一个抽象角色,它给参加组合的对象规定一个接口。
这个角色,给出共有的接口和默认得行为。
其实就我们的Test接口,它定义出run方法。
n Composite:实现共有接口并维护一个测试的集合。
就是我们的复合TestCase,TestSuitn Leaf:代表参加组合的对象,它没有下级子对象,仅定义出参加组合的原始对象的行为,其实就是单一的测试用例TestCase,它仅实现Test接口的方法。
其实componsite模式根据所实现的接口区分为两种形式,分别称为安全式和透明式。
JUnit中使用了安全式的结构,这样在TestCase中没有管理子对象的方法。
3.3.3 实现composite模式告诉我们要引入一个Component抽象类,为Leaf对象和composite对象定义公共的接口。
这个类的基本意图就是定义一个接口。
在Java中使用Composite模式时,优先考虑使用接口,而非抽象类,因此引入一个Test接口。