http://www.cnblogs.com/Automation_software/archive/2011/01/25/1944393.html
重中之重
OOP的一个很好的机制是使用抽象类,抽象类是不能被实例化的,只能提供给派生类一个接口。设计人员通常使用抽象类来强迫实现人员从基类派生,这样可以确保新的类包含一些期待的功能。
在Junit对抽象类的测试中再次引入工厂设计模式,其测试思想是:抽象类不能被实例化,所以使用具体类测试抽象类是不可以的。因此,构造抽象类的测试类必须也是抽象的。该类需要强制声明两种类型的抽象方法。第一类抽象方法即工厂方法,返回所有被测试抽象类的具体子类实例,第二类定义抽象方法返回所有被测试抽象类的具体子类行为期望值。如下面代码,Commodity类是一个商品抽象类,该类的抽象方法描述具体如下:
getCommodityName():取商品名称
changerName():修改商品名称
getCommodityPrice():取商品价格
changerPrice():修改商品价格
Commodity类具体代码如下
package com.fastpiont;
public abstract class Commodity {
public abstract String getCommodityName();// 取得商品名称
public abstract void changerName(String newName);// 修改商品名称
public abstract double getCommodityPrice();// 取得商品价格
public abstract void changerPrice(double newPrice);// 修改商品价格
}
CommodityTestCase是Commodity抽象类的测试类,同样该类被声明为抽象的。Commodity抽象类包含了getCommodity()工厂方法返回具体类实例,因为这才是真正的被测试对象。PrepareAndGetExpectedName()、PrepareAndGetExpectedPrice()、PrepareAndChangerExpectedName()、PrepareAndChangerExpectedPrice()四组方法分别返回具体类实例行为的期望值,即该实例行为的判断基准,具体代码如下:
package com.fastpiont;
import static org.junit.Assert.*;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
public abstract class CommodityTest {
Commodity comm;
public abstract Commodity getCommodity();// 工厂方法,返回具体商品类
public abstract String prepareAndGetExpectedName();// 返回期望值
public abstract double prepareAndGetExpectedPrice();
public abstract String repareAndChangerExpectedName();// 返回更改期望值
public abstract double prepareAndChangerExpectedPrice();
@Before
public void setUp() throws Exception {
comm = getCommodity();
}
@After
public void tearDown() throws Exception {
}
@Test
public void testGetCommodityName() {
String expected = prepareAndGetExpectedName();
String received = getCommodity().getCommodityName();
assertEquals(expected, received);
}
@Test
public void testChangerName() {
comm.changerName(repareAndChangerExpectedName());
assertEquals(repareAndChangerExpectedName(), comm.getCommodityName());
}
@Test
public void testGetCommodityPrice() {
double expected = prepareAndGetExpectedPrice();
double received = getCommodity().getCommodityPrice();
assertEquals(expected, received);
}
@Test
public void testChangerPrice() {
comm.changerPrice(prepareAndChangerExpectedPrice());
assertEquals(prepareAndChangerExpectedPrice(), comm.getCommodityPrice());
}
}
现在根据抽象类测试思想构造一个集成了Commodity抽象类的具体商品子类Commodity_Book,Commodity_Book类的构造方法有两个传参,即根据传入的书籍名称值和书籍单价值生成一本书实例。Commodity_Book类不鼓励直接修改书籍的属性,但是可以通过连歌公共方法changerName()和changerPrice()来实现,具体代码如下:
package com.fastpiont;
public class Commodity_Book extends Commodity {
private String book_name;
private double book_price;
public Commodity_Book(String bookname, double bookprice) {
book_name = bookname;
book_price = bookprice;
}
public void changerName(String newName) {
setBook_name(newName);
}
public void changerPrice(double newPrice) {
setBook_price(newPrice);
}
public String getBook_name() {
return book_name;
}
private void setBook_name(String book_name) {
this.book_name = book_name;
}
public double getBook_price() {
return book_price;
}
private void setBook_price(double book_price) {
this.book_price = book_price;
}
@Override
public String getCommodityName() {
// TODO Auto-generated method stub
return getBook_name();
}
@Override
public double getCommodityPrice() {
// TODO Auto-generated method stub
return getBook_price();
}
}
Commodity_BookTestCase类继承了CommodityTestCase抽象类,整个类显得非常简单,包括工厂方法返回一个具体的Commodity实例和四个针对该实例的期望值设定,具体代码如下:
package com.fastpiont;
import static org.junit.Assert.*;
import org.junit.After;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
public abstract class CommodityTest {
Commodity comm;
public abstract Commodity getCommodity();// 工厂方法,返回具体商品类
public abstract String prepareAndGetExpectedName();// 返回期望值
public abstract double prepareAndGetExpectedPrice();
public abstract String repareAndChangerExpectedName();// 返回更改期望值
public abstract double prepareAndChangerExpectedPrice();
@Before
public void setUp() throws Exception {
comm = getCommodity();
}
@After
public void tearDown() throws Exception {
}
@Test
public void testGetCommodityName() {
String expected = prepareAndGetExpectedName();
String received = comm.getCommodityName();
assertEquals(expected, received);
}
@Test
public void testChangerName() {
comm.changerName(repareAndChangerExpectedName());
assertEquals(repareAndChangerExpectedName(), comm.getCommodityName());
}
@Test
public void testGetCommodityPrice() {
double expected = prepareAndGetExpectedPrice();
double received = comm.getCommodityPrice();
assertEquals(expected, received, 0.001);
}
@Test
public void testChangerPrice() {
comm.changerPrice(prepareAndChangerExpectedPrice());
assertEquals(prepareAndChangerExpectedPrice(),
comm.getCommodityPrice(), 0.001);
}
}
这种针对抽象类的测试方法是Junit推导者所主张的,好处在于该抽象类的所有具体子类都不用在测试抽象类中的所有抽象发发(抽象类中的具体方法除外,因为该方法可能被具体子类覆盖),符合XP测试的接口测试定义。
专注于自动化、性能研究,博客为原创,转载请注明文章来源于:http://www.cnblogs.com/Automation_software/ 只求在IT界有一个清闲的世界让我静心的去专研,不求功名利禄,只为心中的那份成就感及自我成长、自我实现的快感。
标签: Junit
绿色通道: 好文要顶 关注我 收藏该文与我联系
dfine.sqa
关注 - 4
粉丝 - 20
+加关注
1
0
(请您对文章做出评价)
« 上一篇:Junit实现接口类测试
» 下一篇:Junit实现抽象类测试(二)
分享到:
相关推荐
经过自身的亲自实践,终于弄清楚了抽象类测试的简单方法。各位欲想跟我一样去了解,请下载该资源吧!!
JUnit 的设计目标是简化单元测试的创建和集成,通过 `Test` 接口抽象出测试行为,通过 `TestListener` 接口抽象出测试监听行为。测试案例采用 Composite 模式,允许客户代码与现有对象组合,便于测试集成。 JUnit ...
本文将详细介绍软件测试(Junit单元测试)的相关知识点,包括Eclipse的使用、JDK的下载和安装、Junit单元测试的使用、数据库开发过程中的Junit使用、使用Junit进行类测试、抽象类测试、Mock对象测试等。 一、 ...
在实际使用JUnit时,我们需要创建一个测试类,继承自JUnit提供的抽象类或使用注解来定义测试方法。然后,我们可以使用IDE(如IntelliJ IDEA或Eclipse)的集成支持来运行这些测试,查看测试结果和堆栈跟踪。 单元...
PowerMock是另一个在测试领域中非常有用的库,它可以模拟静态方法、构造函数、final类和方法、删除静态初始化器等。当与JUnit结合使用时,PowerMock可以帮助开发者在无法直接控制的情况下进行测试,这对于那些有复杂...
抽象类是一种不能被实例化的类,它定义了一组方法的签名,但没有提供具体的实现。这是为了在多个具有共同行为的类之间共享代码和强制执行某些公共行为。在Java中,使用`abstract`关键字来声明一个类为抽象类。例如,...
1. **创建测试类**:在Android Studio中,可以为每个要测试的类创建一个对应的测试类,通常放在`src/test/java`目录下。 2. **编写测试方法**:使用JUnit注解(如`@Test`)定义测试方法,并使用`assertEquals`, `...
进一步地,JUnit提供了`TestCase`抽象类作为`Test`接口的缺省实现,便于开发者继承并重写方法,而无需直接实现接口。 **关键代码片段**: ```java public interface Test { // Counts the number of test cases ...
3. 抽象工厂模式:在JUnit4中,`Parameterized`测试类利用抽象工厂模式,可以生成一组参数化的测试用例。用户只需提供数据源和测试方法,`Parameterized`会根据数据生成相应的测试实例。 4. 建造者模式:JUnit的`...
Junit框架的核心包`junit.framework`包含了进行单元测试所需的多个关键类和接口。以下是对该包中重要类及接口的深入解析。 ##### Interface Test - **功能**: `Test`接口是所有可执行测试的基础。它规定了测试的...
3. **TestCase抽象类**:TestCase是Test接口的一个实现,提供setUp()和tearDown()方法。setUp()在每个测试方法前执行,用于设置测试环境;tearDown()在每个测试方法后执行,用于清理资源。TestCase的构造函数允许为...
本文将深入探讨如何利用工具实现基于Junit的测试代码自动化生成,以提高开发效率并确保测试覆盖率。 Junit是一个开源的测试框架,它为Java程序员提供了编写和运行可重复测试的能力。它包含了一组注解,如@Test、@...
- **TestCase类:** 抽象类,用于定义测试中的常见方法。它实现了`Test`接口,并提供了一些常用的功能。 - **TestSuite类:** 负责组合多个测试用例。可以包含多个`TestCase`实例或其他`TestSuite`实例。 - **Test...
6. **模板方法模式**:JUnit的TestWatcher是一个抽象类,提供了模板方法,允许子类在特定测试事件发生时执行自定义操作,如在测试失败时生成详细的日志。 在实际使用中,开发者还可以结合其他设计模式,如单例模式...
对于面向对象编程,最小单元就是方法,包括基类(超类)、抽象类、或者派生类(子类)中的方法。. 通常来说,程式设计师每修改一次程式就会进行最少一次单元测试,在编写程式的过程中前后很可能要进行多次单元测试,...