20165219 《Java程序设计》实验二(Java开发环境的熟悉)实验报告

20165219 《Java程序设计》实验二(Java开发环境的熟悉)实验报告

一、实验报告封面

课程:Java程序设计 班级:1652班 姓名:王彦博 学号:20165219 成绩:

指导教师:娄嘉鹏 实验日期:2018年4月16日
实验时间:15:45 - 17:20

实验序号:实验二
实验名称:Java面向对象程序设计

实验内容:

1初步掌握单元测试和TDD

2 理解并掌握面向对象三要素:封装、继承、多态

3 初步掌握UML建模

4 熟悉S.O.L.I.D原则

5 了解设计模式

实验要求:

1 没有Linux基础的同学建议先学习《Linux基础入门(新版)》《Vim编辑器》 课程;

2 完成实验、撰写实验报告,注意实验报告重点是运行结果,遇到的问题(工具查找,安装,使用,程序的编辑,调试,运行等)、解决办法(空洞的方法如“查网络”、“问同学”、“看书”等一律得0分)以及分析(从中可以得到什么启示,有什么收获,教训等);

3 实验报告中统计自己的PSP(Personal Software Process)时间;

4 严禁抄袭。

二、实验内容及步骤

(一)单元测试

产品代码

```
public class MyUtil{
    public static String percentage2fivegrade(int grade){
        //如果成绩小于0,转成“错误”
        if ((grade < 0))
            return "错误";
            //如果成绩小于60,转成“不及格”
        else if (grade < 60)
            return "不及格";
            //如果成绩在60与70之间,转成“及格”
        else if (grade < 70)
            return "及格";
            //如果成绩在70与80之间,转成“中等”
        else if (grade < 80)
            return "中等";
            //如果成绩在80与90之间,转成“良好”
        else if (grade < 90)
            return "良好";
            //如果成绩在90与100之间,转成“优秀”
        else if (grade <= 100)
            return "优秀";
            //如果成绩大于100,转成“错误”
        else
            return "错误";
    }
}

```

码云链接

测试代码

```
import org.junit.Test;
import junit.framework.TestCase;
public class MyUtilTest extends TestCase {
    @Test
    public void testNormal() {
        assertEquals("不及格", MyUtil.percentage2fivegrade(55));
        assertEquals("及格", MyUtil.percentage2fivegrade(65));
        assertEquals("中等", MyUtil.percentage2fivegrade(75));
        assertEquals("良好", MyUtil.percentage2fivegrade(85));
        assertEquals("优秀", MyUtil.percentage2fivegrade(95));
    }

    @Test
    public void testExceptions () {
        assertEquals("错误",MyUtil.percentage2fivegrade(105));
        assertEquals("错误",MyUtil.percentage2fivegrade(-55));
    }

    @Test
    public void testBoundary () {
        assertEquals("不及格", MyUtil.percentage2fivegrade(0));
        assertEquals("及格", MyUtil.percentage2fivegrade(60));
        assertEquals("中等", MyUtil.percentage2fivegrade(70));
        assertEquals("良好", MyUtil.percentage2fivegrade(80));
        assertEquals("优秀", MyUtil.percentage2fivegrade(90));
        assertEquals("优秀", MyUtil.percentage2fivegrade(100));
    }

}

```

码云链接

测试成功截图如下

(二)以TDD的方式研究学习StringBuffer

产品代码

```
public class StringBufferDemo{
    StringBuffer buffer = new StringBuffer();
    public StringBufferDemo(StringBuffer buffer){
        this.buffer = buffer;
    }
    public Character charAt(int i){
        return buffer.charAt(i);
    }
    public int capacity(){
        return buffer.capacity();
    }
    public int length(){
        return buffer.length();
    }
    public int indexOf(String buf) {
        return buffer.indexOf(buf);
    }

}
```

测试代码

```
import junit.framework.TestCase;
import org.junit.Test;

public class StringBufferDemoTest extends TestCase {
    StringBuffer a = new StringBuffer("StringBuffer");
    //测试12个字符
    StringBuffer b = new StringBuffer("StringBufferStringBuffer");
    //测试24个字符
    StringBuffer c = new StringBuffer("StringBufferStringBufferStringBuffer");
    //测试36个字符
    StringBuffer d = new StringBuffer("StringBufferStringBufferStringBufferStr");
    //测试39个字符
    @Test
    public void testcharAt() {
        assertEquals('S',a.charAt(0));
        assertEquals('e',b.charAt(10));
        assertEquals('f',c.charAt(20));
        assertEquals('B',d.charAt(30));
    }
    @Test
    public void testcapacity() {
        assertEquals(28,a.capacity());
        assertEquals(40,b.capacity());
        assertEquals(52,c.capacity());
        assertEquals(55,d.capacity());
    }
    @Test
    public void testindexOf() {
        assertEquals(0,a.indexOf("Str"));
        assertEquals(3,b.indexOf("ing"));
        assertEquals(6,c.indexOf("Buffer"));
        assertEquals(8,d.indexOf("ff"));
    }
    @Test
    public void testlength() {
        assertEquals(12,a.length());
        assertEquals(24,b.length());
        assertEquals(36,c.length());
        assertEquals(39,d.length());
    }

}

```

代码链接

测试成功的截图如下

(三)体会OCP原则和DIP原则的应用

支持SHORT类的代码

```
abstract class Data {
    abstract public void DisplayValue();
}
class Integer extends  Data {
    int value;
    Integer() {
        value=100;
    }
    public void DisplayValue(){
        System.out.println (value);
    }
}
class Short extends Data {
    short value;
    Short() {
        value = 5219;
    }
    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 ShortFactory extends Factory {
    public Data CreateDataObject(){
        return new Short();
    }
}
//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 ShortFactory());
        d.DisplayData();
    }
}
```

代码链接

运行成功的截图

(四)以TDD的方式开发一个复数类Complex

产品代码

```
public class Complex {
    // 定义属性并生成getter,setter
    double RealPart;
    double ImagePart;
    // 定义构造函数
    public Complex(){
        RealPart = 0;
        ImagePart = 1;
    }
    public Complex(double R,double I){
        ImagePart = I;
        RealPart = R;
    }

    //Override Object
    public boolean equals(Object obj){
        if(this == obj) {
            return true;
        }
        if(!(obj instanceof Complex)) {
           return false;
        }
        Complex complex = (Complex) obj;
        if(complex.RealPart != ((Complex) obj).RealPart) {
             return false;
         }
        if(complex.ImagePart != ((Complex) obj).ImagePart) {
             return false;
         }

         return true;
    }
    public String toString()   {
        String string = "";
        if (ImagePart > 0)
            string =  RealPart + "+" + ImagePart + "i";
        if (ImagePart == 0)
            string =  RealPart + "";
        if (ImagePart < 0)
            string = RealPart + " " + ImagePart + "i";
        return string;
    }
    // 定义公有方法:加减乘除
    Complex ComplexAdd(Complex a) {
        return  new Complex(RealPart+a.RealPart,ImagePart+a.ImagePart);
    }
    Complex ComplexSub(Complex a) {
        return new Complex(RealPart-a.RealPart,ImagePart-a.ImagePart);
    }
    Complex ComplexMulti(Complex a) {
        return new Complex(RealPart*a.RealPart,ImagePart*a.ImagePart);
    }
    Complex ComplexDiv(Complex a) {
        if(a.RealPart==0||a.ImagePart==0) {
            System.out.println("被减数不能为0");
            return new Complex();
        }

        double d = Math.sqrt(a.RealPart*a.RealPart)+Math.sqrt(a.ImagePart*a.ImagePart);
        return new Complex((RealPart*a.RealPart+ImagePart*a.ImagePart)/d,Math.round((RealPart*a.ImagePart-ImagePart*a.RealPart)/d));
    }
}

```

测试代码

```
import static org.junit.Assert.*;
import org.junit.Test;
import junit.framework.TestCase;
public class ComplexTest extends TestCase {
    Complex complex = new Complex(1,1);
    @Test
    public void testAdd(){
        assertEquals(new Complex(3.3,3.4), complex.ComplexAdd(new Complex(2.3,2.4)));
    }
    //测试加法
    @Test
    public void testSub(){
        assertEquals(new Complex(-5.3,-2.4), complex.ComplexSub(new Complex(6.3,3.4)));
    }
    //测试减法
    @Test
    public void testMulti(){
        assertEquals(new Complex(3.0,2.0), complex.ComplexMulti(new Complex(3.0,2.0)));
    }
    //测试乘法
    @Test
    public void testDiv(){
        assertEquals(new Complex(1.0,1.0), complex.ComplexDiv(new Complex(1.0,1.0)));
        assertEquals(new Complex(0.0,0.0), complex.ComplexDiv(new Complex(1.0,0.0)));
        //assertEquals(new Complex(0.0,0.0), complex.ComplexDiv(new Complex(3,4)));
        //边缘测试
    }
    @Test
    public void testequals(){
        assertEquals(true, complex.equals(new Complex(1.0,1.0)));
    }
    //测试判断相等
}

```

测试成功截图

(五) 使用StarUML对实验二中的代码进行建模

三、实验中出现的问题及解决过程

1 在向idea中添加junit.jar包的时候,通过在everything中搜索,我出现如下情况:

image

然而老师教程中是这样的:
image

解决:直接选择复制压缩包的地址,并不会影响添加junit.jar包

2 按照老师的教程,在idea中添加junit.jar包后,发现还是不能解决TestCase是红色的问题

解决:经过询问,还需要添加junit-4.12,步骤:

1 打开File中的Project Structure

image

2 点击Dependencies,单击右上角的+,然后选择第一个JARs....

3 粘贴刚才复制的junit-4.12路径,选择lib文件夹中的junit-4.12,然后单击ok

3 测试类代码编译成功并没有出现“绿条”

未解决

四、实验心得

本次实验比上一次复杂了很多,代码的编写也让自己发现了学习中的不足,老师教给我们要“积极主动敲代码”,我反思了一下自己,觉得自己是没有做到积极主动。在这次试验中,我感觉自己已经初步掌握了单元测试和 TDD,基本完成了实验目标。

原文地址:https://www.cnblogs.com/wyb-1998/p/8848152.html