JUnitのユニットテスト
-
- ブラックボックステスト:プログラムは、出力が所望の値ことができるかどうかを確認するために、入力値にコードを記述する必要はありません
- ホワイトボックステスト:いくつかのコードを必要とする、プログラムは、具体的な実施方法に関し、
JUnitの使用:ホワイトボックス
ステップ:
-
クラステスト(テスト)を定義
テストを定義します。あなたは、独立して実行することができます
この方法は、注釈(@Test)を追加する(メソッド独立して実行することができます注釈を追加する必要があります)
JUnitの導入環境に依存
決意の結果:
赤:テストが失敗しました
緑:テストが成功しました
一般的に、我々は、結果Asser.assertEquals(所望の結果、実際の結果)を処理するためにアサーションを使用します。
補足:@Before:
修正方法は、自動的にテストメソッドの前に実行されます
@After:
修正方法は、テストの実行方法の後に実行されます
package cn.itcast.junit; //计算器类 public class Calculator { public int add(int a,int b){ return a+b; } public int sub(int a ,int b){ return a-b; } }
package cn.itcast.test; //需要导入junit包,才可以独立运行方法 import cn.itcast.junit.Calculator; import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Test; /** * @Author: A * @Date: 2019/5/30 10:33 * @Version 1.0 * 测试add方法 */ public class CalculatorTest { /* * 初始化方法 * 用于资源申请,所有测试方法在执行之前都会先执行此方法 * */ @Before public void init(){ System.out.println("init......"); } /* * 释放资源方法 * 在所有测试方法执行完毕后,都会执行该方法 * */ @After public void close(){ System.out.println("close..."); } @Test public void testAdd(){ //System.out.println("我被执行了"); //创建计算器对象 Calculator c = new Calculator(); //调用add方法 int result = c.add(1,2); System.out.println(result); //断言 //我期望的结果是2,真实结果不是,断言失败 //程序控制台出现红色 Assert.assertEquals(3,result); } } //init...... //3 //close...
リフレクション:デザインフレーム魂
-
- フレーム:半完成ソフトウェア。ソフトウェアは、コードを簡素化するために、ベースフレーム上で開発することができます
- 反射:(等メンバメソッドの一部、メンバ変数、構成方法、を含む)反射されたクラスの他のオブジェクトのようなパッケージの様々な構成要素
- リフレクション:クラスファイルオブジェクトのメンバ変数によっては、工法、ファイル・メンバーのメソッドを使用します。
方法のClassオブジェクトを取得します:
-
- Class.forNameの(「完全なクラス名」):メモリにロードされたバイトコードファイル、オブジェクトリターンクラス
- クラス名の.class:クラス名によって属性クラスを取得します
- .getClassオブジェクト()
//Class.forName("全类名") //多用于配置文件 Class cls1 = Class.forName("cn.itcast.domain.Person"); //类名.class //多用于参数的传递 Class cls2 = Person.class; //对象.getClass() //多用于对象的获取字节码的方式 Person p = new Person(); Class cls3 = p.getClass();
フィールド:メンバ変数
一般的な方法
1.設定値ボイドセット(オブジェクトobj、Object値)
2.は、get(オブジェクトobj)パラメータには、オブジェクトを渡す必要がある値を取得します。
3.(真)setAccessibleアクセス修飾子のセキュリティチェックを無視
メンバ変数の取得
package cn.itcast.reflect; //接下来要写的几个获取功能的类都与此类有关联 public class Person { private String name; private int age; public String a; protected String b; String c; private String d; public Person() { } public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public int getAge() { return age; } public void setName(String name) { this.name = name; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + ", a='" + a + '\'' + ", b='" + b + '\'' + ", c='" + c + '\'' + ", d='" + d + '\'' + '}'; } public void eat(){ System.out.println("eat...."); } public void eat(String food){ System.out.println("eat...."+food); } }
package cn.itcast.reflect; import java.lang.reflect.Field; public class ReflectDemo { public static void main(String[] args) throws Exception{ //获取Person的Class对象 Class personClass = Person.class; //调用Class对象的方法getFields获取成员变量,返回的是Field[] 成员变量的数组 //获取所有的public 修饰的成员变量 Field[] fields = personClass.getFields(); //对fields遍历,获取每一个public修饰的成员变量 for(Field field :fields){ System.out.println(field); } //获取指定名称的public 修饰的成员变量 //Field getField(String name) Field a =personClass.getField("a"); //获取成员变量a的值,需要使用get(Object obj)方法,需要传递对象参数 Person p = new Person(); Object value = a.get(p); System.out.println(value);//null //设置成员变量a的值 a.set(p,"张三"); System.out.println(p); System.out.println("===================="); //获取所有的成员变量,不考虑修饰符 Field[] declaredFields = personClass.getDeclaredFields(); for(Field dec :declaredFields){ System.out.println(dec); } //获取指定名称的成员变量 //Field getDeclaredField(String name) Field d =personClass.getDeclaredField("d"); //忽略访问权限的修饰符的安全检查 d.setAccessible(true); //获取成员变量的值,需要传递对象参数 Object value2 = d.get(p); System.out.println(value2); } }
コンストラクタ:コンストラクタ
オブジェクトを作成します:T新しいインスタンス(Oject ... initargs)パラメータは、Object型のコンストラクタのパラメータであり、
あなたは空の引数のコンストラクタを持つオブジェクトを作成する場合は、操作を簡略化することができる:のnewInstance Classオブジェクトのメソッドを
工法を取得
package cn.itcast.reflect; import java.io.ObjectStreamClass; import java.lang.reflect.Constructor; public class ReflectDemo1 { public static void main(String[] args) throws Exception{ //获取Person的Class对象 Class personclass = Person.class; //获取Class对象的构造方fa Constructor c =personclass.getConstructor(String.class,int.class); System.out.println(c); //构造方法用来创建对象的, //Constructor 有个方法newInstance可以创建对象 Object person = c.newInstance("张三",22); System.out.println(person); //使用空参数构造器创建对象 Constructor c1 =personclass.getConstructor(); System.out.println(c1); Object person1 = c1.newInstance(); System.out.println(person1); //可以通过Class对象方法直接创建空参数的构造器 Object o = personclass.newInstance(); System.out.println(o); } }
クラスのメンバーを得る方法
方法:Methodオブジェクト
実行方法:オブジェクトの呼び出し(オブジェクトobj、オブジェクト... argsが)実際のオブジェクトとパラメータリストを渡す必要があります
クラス名を取得します。
文字列のgetName()
package cn.itcast.reflect; import java.lang.reflect.Method; public class ReflectDemo2 { public static void main(String[] args) throws Exception{ //获取Person的Class对象,返回的是一个Class类 Class personClass = Person.class; //获取指定的Public成员方法 //需要传递方法的名称,返回值是Method类 Method eat_Method =personClass.getMethod("eat"); Person p = new Person(); eat_Method.invoke(p);//eat.... //获取有参数的成员方法,需要传递方法名称 Method eat_method2 =personClass.getMethod("eat",String.class); //获取到方法,就要执行方法 //执行方法,需要传递对象和参数 eat_method2.invoke(p,"饭"); //获取所有public 方法 Method[] allMethod = personClass.getMethods(); for(Method method : allMethod){ //获取方法的名称getName(); System.out.println(method.getName()); System.out.println(method); } //获取类名 String className=personClass.getName(); System.out.println(className);//cn.itcast.reflect.Person } }
ケース
要件:クラスに任意のコードを変更しないという前提の下で、あなたは私たちが、任意のクラスのオブジェクトを作成するのに役立ち、及び方法のいずれかを実行することができ、フレームワークを書きます
ステップ:
-
- あなたは、設定ファイルで実行されるメソッドを作成して定義する必要があるオブジェクトの完全なクラス名
- プログラムでは、設定ファイルがロードされている読み込み
- メモリにクラスファイルをロードするために、反射技術を使用して
- オブジェクトを作成します。
- 実行方法
package cn.itcast.reflect; import java.io.InputStream; import java.lang.reflect.Method; import java.util.Properties; public class ReflectTest { public static void main(String[] args) throws Exception{ //加载配置文件 //创建Properties对象 Properties pro = new Properties(); //获得Class字节码文件 Class c = ReflectTest.class; //通过字节码文件c下的方法getClassLoader 可以获得一个类加载器 ClassLoader cl = c.getClassLoader(); //可以通过Classloader类下的方法“getResourceAsStream(String name)”可以找到需要的配置文件获得一个字节输入流 //传递的参数为要加载的文件,获取字节输入流 InputStream is= cl.getResourceAsStream("pro1.properties"); //Properties 类的方法 “load(InputStream inStream);”需要一个字节输入流的参数 //可以使用Properties集合中的方法load,把硬盘中保存的文件,读取到集合中使用 pro.load(is);//配置文件加载完成 //获取配置文件中定义的数据 String className = pro.getProperty("className"); String methodName=pro.getProperty("methodName"); //加载该类进内存, Class cls= Class.forName(className); //创建对象,可以通过Class中的方法newInstance来获取 Object obj= cls.newInstance(); //获取指定的成员方法 Method method = cls.getMethod(methodName); //执行方法,需要传递对象obj method.invoke(obj); } } //似懂非懂……懂非懂…………非懂………………懂…………
コメント
-
定義:コードレベルの記述をメタデータとしても知られているノート(注釈)、彼は特性JDK1.5であり、後のクラスを導入し、インターフェイス、列挙型が同じレベルにあり、彼は、パッケージ内で宣言することができますこれらの要素のための方法の上記クラス、フィールド、メソッド、ローカル変数、パラメータ等を説明する、ノート
-
役割カテゴリ:
- 識別コードで注釈付き文書作成:ドキュメントを書きます
- コード分析:コード識別に注釈を付けることにより、コードの分析
- チェックをコンパイルします。コンパイラは、基本的なチェックをコンパイルできるように、識別コードに注釈を付けることにより、
ノートの所定数のJDK
-
@Overrideは:コメントが親クラスから継承されるかどうかにマークを検出します
@deprecated:このコメントは他界したこと、コンテンツをマーク
@SuppressWarnings:抑制の警告
カスタム注釈
-
フォーマット:
元のノート:
{}パブリック@interface注釈名
エッセンス:注釈は、基本的にデフォルトの注釈インターフェイスを継承インタフェースであり、
プロパティ:インターフェースのメンバーは、メソッドを定義することができます
プロパティの戻り値の型
複数のタイプの3. 4. 5.注釈アレイを2.String 1.基本データ型列挙
プロパティを定義し、使用中のプロパティの割り当てを与えます
1. 如果定义属性时,使用default关键字给属性默认初始化值,则使用注解时,可以不就行属性的赋值
- そこに属性を割り当てる必要があるだけで、その値は、プロパティの名前である場合は、値を省略することができ、値を直接定義することができます
- アレイの一つの値だけがある場合、{値}のパッケージを使用してアレイを割り当てる{省略}
- そこに属性を割り当てる必要があるだけで、その値は、プロパティの名前である場合は、値を省略することができ、値を直接定義することができます
メタ注釈:注釈は注釈を記述するために使用されています
-
@Target:注釈は場所の役割を記述することができます
ElementType値:TYPE:クラスであることができる;方法:方法は、フィールドに適用することができる:メンバ変数に適用することができます
@Retention:フェーズ説明メモを予約することができます
@Retention(RetentionPolicy、RUNTIME):現在の注釈で説明するには、クラスのバイトコードファイルに保持され、JVMに読み込まれます
@Documented:ドキュメントは、APIの中に描かれているかどうかを記述ノート
@Inherited:サブクラスによって継承されたかどうかについてのメモ
package cn.itcast.reflect; public @interface Myanno2 { }
package cn.itcast.reflect; //枚举类的定义 public enum Person2 { p1,p2; }
package cn.itcast.reflect; public @interface Myanno { //注解可以返回的类型 // 1.基本数据类 2.String 3.枚举 4.注解 5.以上类型的数组 int show1(); public abstract String show2() default "张三"; public abstract Person2 per(); Myanno2 anno2(); //String[] strs();*/ }
package cn.itcast.reflect; //String类型的返回值已经被default修饰了,可以不用对属性进行赋值 @Myanno(show1=1,per=Person2.p1,anno2=@Myanno2) public class Worker { }
ケース演習ノート
package cn.itcast.reflect; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface Check { }
package cn.itcast.reflect; public class Calculator { //加法 @Check public void add(){ System.out.println("1+0="+(1+0)); } //减法 @Check public void sub(){ System.out.println("1-0="+(1-0)); } //乘法 @Check public void mul(){ System.out.println("1*0="+(1*0)); } //除法 @Check public void div(){ System.out.println("1/0="+(1/0)); } public void show(){ System.out.println("永无bug"); } }
package cn.itcast.reflect; import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; import java.lang.reflect.Method; /** * 简单的测试框架 * 当主方法执行后,会自动检测所有方法(加了Check注解的方法) */ public class TestCheck { public static void main(String[] args) throws IOException { //创建计算器对象 Calculator c = new Calculator(); //获取字节码文件 Class cls = c.getClass(); //获取所有方法 Method[] methods = cls.getMethods(); int number =0;//出现异常的次数 BufferedWriter bw = new BufferedWriter(new FileWriter("bug.txt")); for(Method method : methods){ //判断方法上是否有Check注解 if(method.isAnnotationPresent(Check.class)){ //有,执行 try{ method.invoke(c); }catch (Exception e){ //捕获异常 //记录到文件中 number++; bw.write("方法出异常了"); bw.newLine(); bw.write("异常名称:"+e.getCause()); bw.newLine(); bw.write("异常的原因"+e.getCause().getMessage()); bw.newLine(); bw.write("--------------------"); bw.newLine(); } bw.write("本次测试一共出现"+number+"次异常"); bw.flush(); } } } }
/*
*本次测试一共出现0次异常本次测试一共出现0次异常方法出异常了
异常名称:java.lang.ArithmeticException: / by zero
异常的原因/ by zero
--------------------
本次测试一共出现1次异常本次测试一共出现1次异常
/