问题
我们已经应用了Command模式来表现一个测试用例。Command依赖于一个单独的像execute()这样的方法(在TestCase中称为run())来对其进行调用。这样允许我们能够通过相同的接口来调用一个command的不同实现。
如果实现一个测试用例,就必须实现继承Testcase,然后实现run方法,实际是testRun,测试人员就把所有的测试用例都继承相同的类,这样的结果就会造成产生出大量的子类,使系统的测试维护相当困难,并且setUp和tearDown仅为这个testRun服务,其他的测试也必须完成相应的代码,从而增加了开发人员的工作量,怎样解决这个问题?
为了避免类的急剧扩散,试想一个给定的测试用例类可以实现许多不同的方法,每一个方法都有一个描述性的名称,如testGetMessage或testSetMessage。这样测试用例并不符合简单的command接口。因此又会带来另外一个问题就是,使所有测试方法从测试调用者的角度(JUnit框架)上看都是相同的。怎样解决这个接口不匹配问题?
思考设计模式的适用性,Adapter(适配器)模式便映入脑海。Adapter具有以下意图“将一个类的接口转换成客户希望的另外一个接口”。这听起来非常适合。把具有一定规则的描述性方法如testGetMessage,转化为JUnit框架所期望的Command(TestCase的run)从而方便框架执行测试。Adapter模式又分为类适配器和对象适配器。类适配器是静态的实现在这里不适合使用,于是使用了对象适配器。
适配器模式的构成:
1、Target 系统所期望的目标接口
2、 Adaptee 现有需要适配的接口
3、 Adapter 适配器角色,把源接口转化成目标接口
模式的记忆方式:
假如我们家的台灯的插头是2相的,但是我们墙壁上的电源插座是3相的,那我们如何用呢???可以去买一个插排,插排接电源的是3孔的,插排上有很多插孔是2孔的,那么插排起到的作用就是桥梁,起转换的作用,在这里就是适配器模式中的适配器。
适配器模式的代码实现:
Target: //台灯插头
public interface Target {
public void method1();
}
Adapter: //插排
public class Adapter implements Target {
private Adaptee adaptee;
public Adapter(Adaptee adaptee) {
this.adaptee = adaptee;
}
public void method1() {
adaptee.method2();
}
}
Adaptee: //墙壁上的电源
public class Adaptee {
public void method2() {
System.out.println("method2");
}
}
Client:
public class Client {
public static void main(String[] args) {
Target target = new Adapter(new Adaptee());
target.method1();
}
}
在实现对象的适配时,首先在TestCase中定义测试方法的命名规则必须是public void testXXXXX()这样我们解析方法的名称,如果符合规则认为是测试方法,然后使用Adapter模式把这些方法,适配成Command的runTest方法。在实现时使用了java的反射技术,这样便可很容易实现动态适配。代码如下
protected void runTest() throws Throwable {
//使用名称获得对象的方法,如testGetMessage,然后动态调用,适配成runTest方法
Method runMethod= getClass().getMethod(fName, null);
runMethod.invoke(this, new Class[0]);
}
在这里目标接口Target和适配器Adapter变成了同一个类,TestCase,而测试用例,作为Adaptee
效果
我们来考虑经过使用Adapter模式后给系统的架构带来了那些效果:
1、使用Adapter模式简化测试用例的开发,通过按照方法命名的规范来开发测试用例,不需要进行大量的类继承,提高代码的复用,减轻测试人员的工作量
2、使用Adapter可以重新定义Adaptee的部分行为,如增强异常处理等
分享到:
相关推荐
《Junit设计模式分析》这本书深入探讨了如何在单元测试框架Junit中巧妙地应用设计模式,以提高代码的可测试性和可维护性。在软件开发过程中,设计模式是解决常见问题的最佳实践,它们能够帮助开发者创建灵活、可扩展...
《JUnit设计模式分析》 JUnit是Java编程语言中广泛使用的单元测试框架,它极大地简化了对代码进行测试的过程。设计模式则是软件工程中的一种最佳实践,通过总结和抽象出常见问题的解决方案,使得开发者能够更好地...
以下是一些在JUnit中常见的设计模式: 1. 工厂模式:JUnit通过TestSuite类实现了工厂模式,它可以根据测试类动态创建测试集合。这使得用户可以方便地组合不同的测试类进行批量执行。 2. 单例模式:JUnit的Test...
本文将深入探讨JUnit中的设计模式,以及如何通过理解这些模式来简化JUnit的使用。 首先,JUnit的核心设计理念之一是“依赖注入”,这是设计模式中的一个关键概念。依赖注入允许测试类动态地获取它们所依赖的对象,...
《Junit设计模式应用》是基于作者业余时间的翻译成果,旨在通过设计模式的角度深入剖析JUnit的内在原理,以此促进读者对单元测试框架理解和运用能力的提升。设计模式是软件工程中的宝贵经验总结,它为解决常见问题...
在实际使用中,开发者还可以结合其他设计模式,如单例模式用于管理共享资源,适配器模式用于兼容不同的测试接口等,进一步增强JUnit的功能。 此外,提供的图像文件可能是在博客文章中用来辅助解释这些概念的图表,...
适配器模式是一种设计模式,属于结构型模式,它的主要目的是解决接口不兼容的问题,使得原本因接口不匹配而无法协作的类能够协同工作。适配器模式通过创建一个新的适配器类,将一个类的接口转换为客户期望的另一个...
本文将深入探讨JUnit中应用到的两种主要设计模式:适配器模式和命令模式。 首先,适配器模式在JUnit中的应用主要体现在对接不同接口或类的能力上。适配器模式允许不兼容的类协同工作,通过将旧的或不兼容的接口转换...
JUNIT作为Java编程语言中最广泛使用的单元测试框架,能够帮助开发者验证代码的正确性和设计模式的有效应用。本篇将详细介绍如何使用JUNIT来验证设计模式。 一、设计模式与JUNIT结合的重要性 设计模式的引入是为了...
【标题】:“吉林大学软件设计模式大富翁游戏(JAVA实现)”是一个基于Java编程语言开发的项目,旨在教育和实践软件设计模式。这个项目可能是吉林大学计算机科学或软件工程专业学生的课程作业,目的是让学生在实际...
#### 四、面试中常见的设计模式相关问题 **1. 在什么情况下使用继承,在什么情况下使用组合?** - 继承主要用于表示“is-a”关系,即一个类是另一个类的一种特例。当一个类的本质特性与另一个类相似时,使用继承...
设计模式通常分为三大类:创建型模式(如工厂模式、抽象工厂模式、单例模式等)、结构型模式(如适配器模式、装饰器模式、代理模式等)和行为型模式(如观察者模式、策略模式、责任链模式等)。每种模式都有其适用...
结构型设计模式包括适配器模式(Adapter)、装饰器模式(Decorator)和代理模式(Proxy),它们关注如何组合类和对象,以达到新的功能或改善已有结构。例如,装饰器模式允许动态地给对象添加新功能,而不会破坏其...
Java设计模式是软件开发中的重要概念,它是一种在特定情境下解决常见问题的模板或最佳实践。本项目提供了Java语言实现的23种经典设计模式的简单示例,旨在帮助开发者理解和应用这些模式。以下是这23个设计模式的详细...
设计模式分为三大类:创建型模式(如单例模式、工厂模式、抽象工厂模式、建造者模式、原型模式)、结构型模式(如代理模式、装饰器模式、适配器模式、桥接模式、组合模式、外观模式、享元模式)和行为型模式(如...
2. 结构型设计模式:如适配器模式、装饰器模式、代理模式、桥接模式、组合模式、外观模式和享元模式,这些模式关注于如何将不同组件组合在一起,提高系统的可扩展性。 3. 行为型设计模式:如观察者模式、命令模式、...
设计模式是解决软件设计中常见问题的经验总结。比如工厂模式(Factory Pattern)提供了一种创建对象的最佳方式,适配器模式(Adapter Pattern)允许不同接口的类协同工作,单例模式(Singleton Pattern)确保一个类...
8. 组件设计模式:在 Java 中,有多种组件设计模式,例如工厂模式、抽象工厂模式、桥接模式、适配器模式等,每种模式都有其特点和应用场景。 9. 组件测试:在 Java 中,组件测试是非常重要的,可以使用 JUnit、...