ivaneye.com

读源码-String

String操作

public class Test {
    public static void main(String[] args) {
        String str = "abCb";
        System.out.println(str.length());
        System.out.println(str.charAt(2));
        System.out.println(str.getBytes());
        System.out.println(str.equals("abc"));
        System.out.println(str.equalsIgnoreCase("aBc"));
        System.out.println(str.compareTo("bbb"));
        System.out.println(str.contains("b"));
        System.out.println(str.startsWith("a"));
        System.out.println(str.endsWith("c"));
        System.out.println(str.indexOf(0));
        System.out.println(str.lastIndexOf(0));
        System.out.println(str.substring(1));
        System.out.println(str.concat("d"));
        System.out.println(str.replace("b", "B"));
        System.out.println(str.replaceAll("b", "B"));
        System.out.println(str.toLowerCase());
        System.out.println(str.toUpperCase());
        System.out.println(str.trim());
        System.out.println(str.split("b"));
    }
}

String实现

String是不可变的,其是一个final类

public final class String

其实现了java.io.Serializable, Comparable, CharSequence三个接口

Java Socket编程中加入代理

方法一

使用系统属性来完成代理设置, 这种方法比较简单, 但是不能对单独的连接来设置代理:

public static void main(String[] args) {
    Properties prop = System.getProperties();
    // 设置http访问要使用的代理服务器的地址
    prop.setProperty("http.proxyHost", "192.168.0.254");
    // 设置http访问要使用的代理服务器的端口
    prop.setProperty("http.proxyPort", "8080");
    // 设置不需要通过代理服务器访问的主机,可以使用*通配符,多个地址用|分隔
    prop.setProperty("http.nonProxyHosts", "localhost|192.168.0.*");
    // 设置安全访问使用的代理服务器地址与端口
    // 它没有https.nonProxyHosts属性,它按照http.nonProxyHosts 中设置的规则访问
    prop.setProperty("https.proxyHost", "192.168.0.254");
    prop.setProperty("https.proxyPort", "443");
    // 使用ftp代理服务器的主机、端口以及不需要使用ftp代理服务器的主机
    prop.setProperty("ftp.proxyHost", "192.168.0.254");
    prop.setProperty("ftp.proxyPort", "2121");
    prop.setProperty("ftp.nonProxyHosts", "localhost|192.168.0.*");
    // socks代理服务器的地址与端口
    prop.setProperty("socksProxyHost", "192.168.0.254");
    prop.setProperty("socksProxyPort", "8000");
    // 设置登陆到代理服务器的用户名和密码
    Authenticator.setDefault(new MyAuthenticator("userName", "Password"));
}

ZooKeeper安装与Java调用

下载

ZooKeeper目前是Apache顶级项目,可从此处下载

安装

客户端操作

ls /                        //列出/下的内容
set /test test              //给/test目录设值
get /test                   //获取/test目录的值

读源码-JUnit4实现

内容回顾

本篇文章将梳理JUnit4源码

代码结构

上篇最后给出了测试UML图

在JUnit3中

而这里

完全通过注解来处理,所以这里主要就梳理一下JUnit4注解处理相关代码

JUnitCore

JUnit4的入口方法在org.junit.runner.JUnitCore中,我们从这里开始。

核心执行方法为run方法

public Result run(Runner runner) {
    Result result = new Result();
    RunListener listener = result.createListener();
    notifier.addFirstListener(listener);
    try {
        notifier.fireTestRunStarted(runner.getDescription());
        runner.run(notifier);
        notifier.fireTestRunFinished(result);
    } finally {
        removeListener(listener);
    }
    return result;
}

结构与JUnit3中的TestRunner的doRun方法类似。

读源码-JUnit4使用

JUnit4简介

之前梳理了JUnit3,此篇将梳理JUnit4。

JUnit4主要引入了注解。我们依然使用之前的例子来进行测试

场景

假设,我们有一个Person类

代码如下:

package org.ivan;
public class Person {
    public String say(String name) {
        return "Hello," + name;
    }
    public String sayHi(String name) {
        return "Hi," + name;
    }
}

在JUnit4中如何进行测试呢?

引入JUnit

首先还是引入JUnit4

<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>4.12</version>
  <scope>test</scope>
</dependency>

读源码-JUnit3设计

内容回顾

本篇主要说明JUnit3的代码设计及为什么这样设计!

run方法

上篇提出了两个问题!第一个问题是:为什么Test中的run方法要传入一个TestResult,然后再将自身传递给TestResult去执行呢?

首先从名字可以看出,TestResult类是用来保存测试结果的。实际上是对测试提供了一个统一的收集测试结果的对象。这实际上是个设计模式,叫Collecting Parameter模式。

Collecting Parameter模式定义

当你需要从几个方法中收集结果时,你应当给方法增加一个参数,并传递一个会替你收集参数的对象。

TestResult就是这样一个对象,它收集的结果可以方便在各个终端显示。

runProtected方法

上篇第二个问题:

为什么TestResult的run()方法中,要先实例化一个Protectable对象,而不直接调用test的runBare方法呢?

实际上,这主要是为了规避代码重复!

查看源码,我们可以看到TestSetup类中的run方法,也实例化一个Protectable对象,继而进行调用。

public void run(final TestResult result) {
  Protectable p= new Protectable() {
    public void protect() throws Exception {
      setUp();
      basicRun(result);
      tearDown();
    }
  };
  result.runProtected(this, p);
}

在这里,Protectable中封装了不同的执行逻辑,然后传递给runProtected方法来执行。

读源码-JUnit3实现

内容回顾

本篇文章将梳理JUnit3源码

代码结构

上篇最后给出了测试UML图

我们可以看出

Assert类

我们先看Assert这个类,你会发现这个类很简单,提供了各种静态的assert*()方法来进行比较。

Test接口

package junit.framework;
public interface Test {
    public abstract int countTestCases();
    public abstract void run(TestResult result);
}