凌宇的java之路(2017年1月23日02:05:53)

[TOC]

Junit测试

用junit测试可以不用每次都去写方法,注释方法去测试,提高了效率,
如何测试呢,看代码:
这个是之前的小方法,用于测试

package com.ly.day01;

public class Ly {

    
    public void sayName(){
        System.out.println("this gay is ly");
    }
}

这个是用来进行junit测试的测试类:

package test;

import org.junit.Test;

import com.ly.day01.Ly;

public class testLy {

    
    @Test
    public void testSayLy(){
        new Ly().sayName();
    }
    
}

其实差别就是多加了一个@Test注解,并且在运行的时候选择 run as junitTest

如果方法没错,那么就会出现绿条:

测试通过

而如果测试失败了,就会出现

测试失败

注解@before 和 @after

在主体类中新增一个方法:

package com.ly.day01;

public class Ly {

    
    public void sayName(){
        System.out.println("this gay is ly");
    }
    
    public void setName(String newName){
        System.out.println("gay, your new name is "+newName);
    }
}

同样的 我们在测试类中新增一个测试方法:

    @Test
    public void testSetName(){
        new Ly().setName("lht");
    }

值得注意的是,一个测试类里面如果有多个测试方法,而我们要一起运行的话,我们可以在

方法概览区

点击整个类运行 run as junitTest

但是在运行之前我们新增2个注解方法:

    
    @Before
    public void before(){
        System.out.println("this gay run before the function");
    }
    
    @After
    public void after(){
        System.out.println("this gay run after the function");
    
    }

运行之后 我们会发现:

this gay run before the function
this gay is ly
this gay run after the function
this gay run before the function
gay, your new name is lht
this gay run after the function

注解@Before@After 在每个运行方法之前都会先运行一次


@BeforeClass 和 @AfterClass

同样的 我们在测试类中新增两个测试方法,注意他们要是静态

@BeforeClass
    public static void beforeClass(){
        System.out.println("before class");
    }
    
    @AfterClass
    public static void afterClass(){
        System.out.println("after class");
    }
    

运行一次,结果为:

before class
this gay run before the function
this gay is ly
this gay run after the function
this gay run before the function
gay, your new name is lht
this gay run after the function
after class

我们可以发现 * @after和@before 在每个测试方法前后都会运行一次,而
@BeforeClass 和 @AfterClass 则是和类挂钩,只运行一次*

而我们注意到,其实我们在上述的每个测试方法里面都会去实例化一个Ly对象,那么其实我们可以抽离出来,如下:

package test;

import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;

import com.ly.day01.Ly;

public class testLy {

    private static Ly mLy;
    
    @BeforeClass
    public static void beforeClass(){
        System.out.println("before class");
        mLy=new Ly();
    }
    
    @AfterClass
    public static void afterClass(){
        System.out.println("after class");
        mLy=null;
    }
    
    @Before
    public void before(){
        System.out.println("this gay run before the function");
    }
    
    @After
    public void after(){
        System.out.println("this gay run after the function");
    
    }
    @Test
    public void testSayLy(){
        mLy.sayName();
    }
    
    @Test
    public void testSetName(){
        mLy.setName("lht");
    }
    
}

他们的结果是一样,
而在开发中 这两对注解我们可以更加实用的去用。


断言 Assert

上面我们只是测了方法是否可以运行,而如果方法是可以运行的,但是我们又不知道方法运行得对不对,那怎么办呢,我们可以用Assert断言来做判断,
首先我们在Ly类中加入方法,返回值为String:

    public String getName(){
        return "Ly";
    }

而在测试类中加入测试方法:

    @Test
    public void testGetName(){
        Assert.assertEquals("Ly", mLy.getName());
    }

我们可以看到Assert.assertEquals中有两个值,一个是我们期望得到的值,一个是方法的返回数据,其实就很像Android中的TextUtils.equals(String str,String str);很显然,两者equals的时候方法通过,绿条;反之黄条。
相应的Assert还有其他的assertXXXX方法,但是用法大同小异。

拿map数据的两种方式:

/**
     * 取map里面的值的方法 传统方法1
     */
    @Test
    public void getMapValue1() {
        /*
         * HashMap是无序的如果我们需要做有序存储,最好用 LinkedHashMap
         */
        Map map = new LinkedHashMap();
        map.put(5, "--1");
        map.put(2, "--2");
        map.put(3, "--3");
        Set set = map.keySet();
        Iterator it = set.iterator();
        while (it.hasNext()) {
            int key = (Integer) it.next();
            String val = (String) map.get(key);
            System.out.println(key + "---" + val);
        }
    }

    /**
     * 取map数据的传统方法2
     */
    @Test
    public void getMapValue2() {
        /*
         * HashMap是无序的如果我们需要做有序存储,最好用 LinkedHashMap
         */
        Map map = new LinkedHashMap();
        map.put(5, "--1");
        map.put(2, "--2");
        map.put(3, "--3");
        Set set = map.entrySet();
        Iterator it = set.iterator();
        while (it.hasNext()) {
            Map.Entry entry = (Entry) it.next();
            int key = (Integer) entry.getKey();
            String val = (String) entry.getValue();
            System.out.println(key + "---" + val);

        }

    }

其实上面的方法还可以用foreach的方法再改进


枚举

package com.ly.day02;

public enum Grade {
    // A, B, C;
    // A("good"), B("just so so"), C("bad");
    A("good") {
        @Override
        public void attitude() {
            System.out.println("表扬");

        }
    },
    B("just so so") {
        @Override
        public void attitude() {
            System.out.println("冷漠脸");

        }
    },
    C("bad") {
        @Override
        public void attitude() {
            System.out.println("批评");

        }
    };
    // 其实枚举就类似于:
    // public static final Grade A=new Grade();

    // 所以枚举类其实就是一个类,我们可以在方法里面加字段,加构造方法:
    private String Evaluation;

    private Grade(String evaluation) {
        Evaluation = evaluation;
    }

    public String getEvaluation() {
        return Evaluation;
    }

    public void setEvaluation(String evaluation) {
        Evaluation = evaluation;
    }

    /**
     * 加入了上述构造方法和getset后,我们之前定义的枚举ABCD爆红了,为什么? 因为他们其实就是public static final Grade
     * A=new Grade(); 我们加了构造方法,替换了之前的无参构造方法,所以就爆红了,我们可以修改为: A("good"),
     * B("just so so"), C("bad");
     */

    /**
     * 如果每个枚举都要做不同的事情的时候,那么我们可以定义一个抽象方法,比如: 而加入了抽象方法之后,我们每个枚举类型都要进行实现: A("good")
     * {
     * 
     * @Override public void attitude() { System.out.println("表扬");
     * 
     *           } }, B("just so so"){
     * @Override public void attitude() { System.out.println("冷漠脸");
     * 
     *           } }, C("bad"){
     * @Override public void attitude() { System.out.println("批评");
     * 
     *           } };
     */

    public abstract void attitude();
}



反射技术

拿到反射class 的三种方法:

package com.ly.day02.reflect;

public class PersonReflect {

    
    public static void main(String[] args) throws ClassNotFoundException {
        
        
//      1
        Class clazz=Class.forName("com.ly.day02.reflect.Person");
        
//      2
        Class clazz1=new Person().getClass();
        
//      3
        Class clazz2=Person.class;
    }
}

拿到类的构造方法(public)

package com.ly.day02.reflect;

public class Person {

    public String name="this is the name";
    public String pass="this is the pass";

    
    


    



    public Person(){
        super();
    }

    public Person(String name, String pass) {
        super();
        this.name = name;
        this.pass = pass;
    }



}

我们可以这么拿Person类的构造方法:

  1. 这里拿的是无参的构造方法:
    @Test
    public void TestDef() throws Exception {
        Class clazz = Class.forName("com.ly.day02.reflect.Person");
        Constructor constructor = clazz.getConstructor(null);
        Person person = (Person) constructor.newInstance(null);
        System.out.println(person.name);
        System.out.println(person.pass);
    }
  1. 这里拿的是有参的构造方法:
@Test
    public void test() throws Exception  {
        Class clazz = Class.forName("com.ly.day02.reflect.Person");
        Constructor constructor = clazz.getConstructor(String.class,
                String.class);
        Person person = (Person) constructor.newInstance("Ly", "password");

        System.out.println(person.name);
        System.out.println(person.pass);

    }

输出结果分别为:

输出结果

访问私有的:

getDeclaredConstructor可以返回指定参数的构造函数,而getConstructor只能放回指定参数的public的构造函数区别只是后者只可以返回公有的构造函数

@Test
    public void test() throws Exception  {
        Class clazz = Class.forName("com.ly.day02.reflect.Person");
        
//      用这个方法来获取非public的构造方法
        Constructor constructor = clazz.getDeclaredConstructor(String.class,
                String.class);
//      暴力破解
        constructor.setAccessible(true);
        Person person = (Person) constructor.newInstance("Ly", "password");

        System.out.println(person.name);
        System.out.println(person.pass);

    }

另外一种获取类的方法,需要对象类里面有一个无参的构造方法:

@Test
    public void testAgain() throws Exception {
        Class clazz = Class.forName("com.ly.day02.reflect.Person");
        Person person = (Person) clazz.newInstance();
        System.out.println(person.toString());
    }

Servlet

微信截图_20170423233705.png
Paste_Image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,826评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,968评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,234评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,562评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,611评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,482评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,271评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,166评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,608评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,814评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,926评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,644评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,249评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,866评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,991评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,063评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,871评论 2 354

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,656评论 18 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,631评论 18 399
  • 一:java概述:1,JDK:Java Development Kit,java的开发和运行环境,java的开发工...
    ZaneInTheSun阅读 2,650评论 0 11
  • $('.we').click(function(){ $('.login').show(); ceshi(); }...
    zhuxinying阅读 371评论 0 0
  • 翻译原文 date:20170728 使用命令行编译器 Solidity代码库的构建对象之一是solc,Solid...
    gaoer1938阅读 704评论 0 1