基础加强
1. 单元测试
1.1 概述
**测试:**测试的目的是尽可能多的发现软件中存在的BUG,而不是为了隐藏BUG。事实上测试有很多种类,比如:边界测试,压力测试,性能测试等。
黑盒测试:也叫功能测试,主要关注软件每个功能是否实现,并不关注软件代码是否有错误。测试人员完全不考虑程序内部的逻辑结构和内部特性。
白盒测试:白盒测试与黑盒测试相反,白盒测试主要检查软件内部逻辑结构、设计等是否符合规定。
灰盒测试:灰盒测试是介于黑盒和白盒之间的一种测试,既关注功能也关注内部逻辑的实现,但并没有白盒测试那么细致。需要灰盒测试的目的是因为白盒测试效率较低。
单元测试:是开发者编写的一小段代码,用于检验被测代码的一个很小的、很明确的功能是否正确。比如一个方法是否正确,比如是否达到想要的效果等
1.2 代码测试
使用@Test注解
@Test
public void testEat(){
}
使用@Before注解:在每个测试方法运行之前执行
@Before
public void before() {
System.out.println("开始之前执行");
}
使用@After注解:表示在测试方法运行之后执行
@After
public void after() {
System.out.println("结束之后执行");
}
@After @Before 标准的方法不能单独运行 与顺序无关
1.3 注意事项
- Junit4中的测试方法上都必须加上@Test才能被标识为测试方法
- 测试方法中没有返回值和参数
- 测试方法必须是公开的
2. 工具类-jar-classpath
2.1 工具类
- 测试类所在的类和包命名,一般以util结尾
- 工具类一般以静态方法或者单例模式创建
2.2 jar包
简单的说jar包就是一个class文件的压缩包和zip、rar性质是一样的
2.2.1 Eclipse如何导出jar包
选中对应的工具类,右键—>Export【】—>选中java目录下的,JAR File—>Next—>选择导出路径—>Finish
2.2.2 Java工程下如何使用jar包
-
找到相应的jar包
-
在工程下面新建一个lib文件夹
-
将jar包拷贝到lib文件夹下面
-
将jar配置到环境变量(classpath)中
2.3 classpath
Eclipse中我们的java代码编译之后生成的.class文件最终都会生成到项目的bin文件夹下
2.3.1 修改.class文件生成的位置
选中项目右键—>Build Path—>Configure Build Path—>弹出框右侧Java Build Path中选中Source,在Source页面下有一个生成路径,可以修改当前生成路径
2.3.2 .classpath文件
**kind=“src”:**代表key, 当它是src的时候(资源文件夹)
path=“src”: 代表值,这个src代表一个路径(文件夹)
现在src所代表的文件夹就是一个资源文件夹
注释:资源文件夹【】里面的内容才会帮我们编译成classes文件
3. 资源文件解析
3.1 概述
- 资源文件也可以看成是配置文件,一般的形式有两种:properties形式和XML形式
- properties文件中数据的存储是以键值对的形式存在,每一行为一条数据,只能存储字符串形式的数据,Properties文件中值的部分任意字符都会被当做值的一部分,尤其是空格
- 资源文件的作用:解决硬编码问题【代码逻辑中写死的代码】
3.2 代码实现
3.2.1 传统io流
public void test() throws IOException {
Properties prop = new Properties();
FileInputStream inStream=new FileInputStream("resources/login.properties");
//把配置文件中的信息 加载到内存中
prop.load(inStream);
System.out.println(prop.getProperty("username"));;
}
3.2.2 字节码对象获取流
-
字节码对象方式获取流,文件最终必须被编译到class文件存放的位置
-
字节码对象获取流参数的规则:前必须带/,若资源文件没有再包中,包的路径可以省略
-
类名.class.getResourceAsStream(/包路径/文件名)
public void test1() throws IOException {
//创建Properties的对象
Properties prop = new Properties();
//获取字节码文件
Class<PropTest> cls= PropTest.class;
//通过字节码文件获取流
InputStream stream = cls.getResourceAsStream("/login.properties");
//加载到内存中来
prop.load(stream);
System.out.println(prop.getProperty("username"));
}
3.2.3 类加载器获取流
3.2.3.1 字节码对象方式获取类加载器
- 字节码对象.getClassLoader()
- 类加载器对象.getResourceAsStream(包名/文件名),路径最前方不需要书写/
Properties prop = new Properties();
//1.通过字节码文件来获取类加载器
Class<PropTest> cls=PropTest.class;
ClassLoader loader = cls.getClassLoader();
InputStream stream = loader.getResourceAsStream("login.properties");
prop.load(stream);
System.out.println(prop.getProperty("username"));
3.2.3.2 线程方式获取类加载器
- Thread.currentThread().getContextClassLoader()
- 类加载器对象.getResourceAsStream(包名/文件名),路径最前方不需要书写/
public void test2() throws IOException {
//创建Properties的对象
Properties prop = new Properties();
//2.通过当前线程来获取类加载器
ClassLoader loader = Thread.currentThread().getContextClassLoader();
InputStream stream = loader.getResourceAsStream("login.properties");
prop.load(stream);
System.out.println(prop.getProperty("username"));
}
4. 设计模式
4.1 单例模式
单例模式可以保证系统中,应用该模式的类一个类只有一个实例。即一个类只有一个对象实例
- 对象构造私有化
- 私有静态当前类类型的字段
- 提供公共,静态对外的访问方法获取对象
4.1.1 饿汉模式
- 饿汉模式:实质上就是在类加载的时候即创建
- 饿汉模式线程安全,但是存在加载效率低下的问题
- 使用静态代码块优化
public class HungryMode {
//1.私有化构造方式
private HungryMode(){}
//2.私有化字段(创建一个该类对象)
private static HungryMode instance;
static{
instance=new HungryMode();
//可以写其他功能代码
}
//3.对外提供一个公共可访问的方法
public static HungryMode getIns(){
return instance;
}
}
4.1.2 懒汉模式
- 懒汉模式:即在需要的时候才创建对象返回
- 懒汉模式容易造成线程不安全问题,故可以同步代码块【synchronized】解决线程问题,但要使用双重校验,而且同步代码块这种方式效率比较低
public class LazyMode {
//私有化构造方法
private LazyMode(){}
//私有化字段
private static LazyMode instance;
//提供公共可访问的方法 返回该类对象
//优化
public static LazyMode getIns(){
//判断对象是否为null 部分人在排队
if(instance==null){
synchronized (LazyMode.class) {
if(instance==null){
instance=new LazyMode();
}
}
}
return instance;
}
}
4.1.3 ThreadLocal
- ThreadLocal 会每一个线程创建一个本地的变量副本
- 每一个线程可以获取到自己创建的变量 不同线程获取到不同的变量
private ThreadLocalSingleton(){}
private static ThreadLocal<ThreadLocalSingleton> local=new ThreadLocal<ThreadLocalSingleton>(){
protected ThreadLocalSingleton initialValue() {
return new ThreadLocalSingleton();
};
};
public static ThreadLocalSingleton getIns(){
return local.get();
}
4.2 装饰者模式
装饰模式指的是在不必改变原类文件和不使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象
实现步骤 :通过对原类文件继承,对原有方法功能的基础上,实现新的功能
public class A {
public void run(){
System.out.println("我会跑步");
}
public static void main(String[] args) {
C c = new C(new A());
c.jump();
}
}
class C{
private A a;
public C(A a){
this.a=a;
}
public void run(){
a.run();
System.out.println("我可以跑到世界第一");
}
}
4.3 简单工厂模式
工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式。
实现步骤:使用工厂对象,根据传递的参数创建对象
4.4 适配器模式
适配器模式(有时候也称包装样式或者包装)将一个类的接口适配成用户所期待的。一个适配允许通常因为接口不兼容而不能在一起工作的类工作在一起,做法是将类自己的接口包裹在一个已存在的类中。
public interface DrinkTest{
void drink();
}
class DrinkAdapter1 implements DrinkTest{
private DrinkTea tea;
public DrinkAdapter1(DrinkTea tea) {
this.tea=tea;
}
@Override
public void drink() {
tea.drink();
}
}
class DrinkTea1{
void drink(){
System.out.print("喝茶");
}
}