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三个接口
方法一
使用系统属性来完成代理设置, 这种方法比较简单, 但是不能对单独的连接来设置代理:
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目前是Apache顶级项目,可从此处下载
安装
- 将下载的压缩包,解压缩到任意路径下.(例如:d:/soft)
- 至ZooKeeper目录/conf下,会发现有一个zoo_sample.cfg,在当前目录拷贝一份,并重命名为zoo.cfg
- 进入ZooKeeper目录/bin下,通过zkServer.cmd或zkServer.sh启动ZooKeeper
客户端操作
- 在ZooKeeper目录/bin下,使用命令行启动zkCli.cmd或者zkCli.sh即可启动ZooKeeper客户端
- 在客户端可以执行: ls,get,set等命令,来展示,获取或设置值
ls / //列出/下的内容
set /test test //给/test目录设值
get /test //获取/test目录的值
内容回顾
- 上篇内容主要介绍了JUnit4的使用
- 如何编写测试类
- 如何运行单个测试类
- 如何运行多个测试类
- 如何设置Class级别的setUp()和tearDown()方法
- 如何多次运行测试
本篇文章将梳理JUnit4源码
代码结构
上篇最后给出了测试UML图
在JUnit3中
- 所有的测试类都继承了TestCase这个类
- TestCase这个类继承了Assert类,实现了Test接口
而这里
完全通过注解来处理,所以这里主要就梳理一下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简介
之前梳理了JUnit3,此篇将梳理JUnit4。
JUnit4主要引入了注解。我们依然使用之前的例子来进行测试
场景
假设,我们有一个Person类
- 包含两个方法say和sayHi
- 两个方法都接收一个String类型的参数
- say返回"Hello,"+arg
- sayHi返回"Hi,"+arg
代码如下:
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的代码设计及为什么这样设计!
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的使用
- 如何编写测试类
- 如何运行单个测试类
- 如何运行多个测试类
- 如何设置Class级别的setUp()和tearDown()方法
- 如何多次运行测试
本篇文章将梳理JUnit3源码
代码结构
上篇最后给出了测试UML图
我们可以看出
- 所有的测试类都继承了TestCase这个类
- TestCase这个类继承了Assert类,实现了Test接口
Assert类
我们先看Assert这个类,你会发现这个类很简单,提供了各种静态的assert*()方法来进行比较。
Test接口
package junit.framework;
public interface Test {
public abstract int countTestCases();
public abstract void run(TestResult result);
}