实验二 面向对象程序设计
实验目的
- 一、提交最后三个JUnit测试用例(正常情况,错误情况,边界情况)都通过的截图,截图上要有画图加水印,输入自己的学号。考查JUnit会不会使用,测试用例至少要包含正常情况,错误情况,边界情况的测试。
- 二、以 TDD的方式研究学习StringBuffer。
- 三、对设计模式示例进行扩充,体会OCP原则和DIP原则的应用,初步理解设计模式。
- 四、以TDD的方式开发一个复数类Complex。
实验内容及步骤
(一)使用JUnit,测试用例
-
在插件安装对话框的搜索中输入
junit
,单击JunitGenerator V2.0
,单击绿色的Install
按钮安装。因为我没有次插件,因此实在网上download到本地,再install plugin from disk
-
进行项目及文件的创建
- 创建项目
- 创建文件
- create Test(创建JUnit3)
- 增加测试用例(附产品代码)
- 测试项目结果如下图所示(含正常、异常、边界)
显示green bar
,测试通过。
(二)以TDD的方式研究学习StringBuffer
-
新建类
-
以 TDD的方式研究学习StringBuffer,用junit进行单元测试
-
运行结果如图
(三)体会OCP原则和DIP原则的应用,初步理解设计模式
- 原代码
class Integer {
int value;
public Integer(){
value=100;
}
public void DisplayValue(){
System.out.println(value);
}
}
class Document {
Integer pi;
public Document(){
pi = new Integer();
}
public void DisplayData(){
pi.DisplayValue();
}
}
public class MyDoc{
static Document d;
public static void main(String [] args) {
d = new Document();
d.DisplayData();
}
}
让系统支持Boolean类,Document类要修改构造方法,这还违反了OCP原则。封装、继承、多态解决不了问题,在则需要设计模式。
abstract class Data {
abstract public void DisplayValue();
}
class Integer extends Data {
int value;
Integer() {
value=100;
}
public void DisplayValue(){
System.out.println (value);
}
}
class Boolean extends Data {
boolean value;
Boolean() {
value = true;
}
public void DisplayValue(){
System.out.println (value);
}
}
// Pattern Classes
abstract class Factory {
abstract public Data CreateDataObject();
}
class IntFactory extends Factory {
public Data CreateDataObject(){
return new Integer();
}
}
class BooleanFactory extends Factory {
public Data CreateDataObject(){
return new Boolean();
}
}
//Client classes
class Document {
Data pd;
Document(Factory pf){
pd = pf.CreateDataObject();
}
public void DisplayData(){
pd.DisplayValue();
}
}
//Test class
public class MyDoc {
static Document d;
public static void main(String[] args) {
d = new Document(new BooleanFactory());
d.DisplayData();
}
}
如此,再class Boolean extends Data
、class BooleanFactory extends Factory
即可使系统支持Boolean
- 运行结果
(四)以TDD的方式开发一个复数类Complex
- 要求
// 定义属性并生成getter,setter
double RealPart;
double ImagePart;
// 定义构造函数
public Complex()
public Complex(double R,double I)
//Override Object
public boolean equals(Object obj)
public String toString()
// 定义公有方法:加减乘除
Complex ComplexAdd(Complex a)
Complex ComplexSub(Complex a)
Complex ComplexMulti(Complex a)
Complex ComplexDiv(Complex a)
- 代码编写
public class Complex{
private double r;
private double i;
public Complex(double r, double i) {
this.r = r;
this.i = i;
}
public static double getRealPart(double r) {
return r;
}
public static double getImagePart(double i) {
return i;
}
public Complex ComplexAdd(Complex c) {
return new Complex(r + c.r, i + c.i);
}
public Complex ComplexSub(Complex c) {
return new Complex(r - c.r, i - c.i);
}
public Complex ComplexMulti(Complex c) {
return new Complex(r * c.r - i * c.i, r * c.i + i * c.r);
}
public Complex ComplexDiv(Complex c) {
return new Complex((r * c.i + i * c.r)/(c.i * c.i + c.r * c.r), (i * c.i + r * c.r)/(c.i * c.i + c.r * c.r));
}
public String toString() {
String s = " ";
if (i > 0)
s = r + "+" + i + "i";
if (i == 0)
s = r + "";
if (i < 0)
s = r + " " + i + "i";
return s;
}
}
-
尝试写测试代码ComplexTest
-
运行结果
(五)使用WhiteStarUML对实验二中的代码进行建模,发类图的截图,加上学号水印。类图中只少两个类。
遇到问题及解决方案
- 问题一:看教程,本来应该在插件安装对话框的搜索中输入
junit
,单击JunitGenerator V2.0
,单击绿色的Install
按钮安装。但我没有搜到JunitGenerator V2.0
。
-
问题一解决方案:通过百度搜索,在网上查找并下载了
http://plugins.jetbrains.com/pluginManager/?action=download&id=org.intellij.plugins.junitgen&build=IU-162.2228.15&uuid=6a6cb9f5-4107-46d7-9b1c-d8205218a73b
,到本地,然后找到插件所在位置,再install plugin from disk
,。 -
问题二:在进行第二步操作时,出现标红,测试未通过。
- 问题二解决方案:把数据
17
换成5
就可以了。
统计PSP(Personal Software Process)时间:
步骤 | 耗时 | 百分比 |
---|---|---|
设计 | 120min | 50% |
代码实现 | 60 | 25% |
测试 | 30 | 12.5% |
分析总结 | 30 | 12.5% |
实验小结
本次实验主要学会了如何使用junit来测试代码。在不断调试中,发现junit有他得天独厚之处,方便,简洁,快速,收获很大。