国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

25.單元測(cè)試、反射

這篇具有很好參考價(jià)值的文章主要介紹了25.單元測(cè)試、反射。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

一.單元測(cè)試

1.1?什么是單元測(cè)試

單元測(cè)試就是針對(duì)最小的功能單元編寫測(cè)試代碼,Java程序最小的功能單元是方法。因此,單元測(cè)試就是針對(duì)Java方法進(jìn)行的測(cè)試,進(jìn)而檢查方法的正確性。

1.2?目前測(cè)試方法是怎么進(jìn)行的

  • 只有一個(gè)main方法,如果一個(gè)方法的測(cè)試失敗了,其他測(cè)試方法會(huì)受到影響。
  • 無法得到測(cè)試的結(jié)果報(bào)告,需要程序員自己去觀察測(cè)試是否成功。
  • 無法實(shí)現(xiàn)自動(dòng)化測(cè)試。

1.3?Junit

Junit概述

JUnit是使用Java語言實(shí)現(xiàn)的單元測(cè)試框架,它是開源的,Java開發(fā)者都應(yīng)當(dāng)學(xué)習(xí)并使用JUnit編寫單元測(cè)試。此外,幾乎所有的IDE工具都集成了JUnit,這樣我們就可以直接在IDE中編寫并運(yùn)行JUnit測(cè)試。

Junit優(yōu)點(diǎn)
  • JUnit可以靈活的選擇執(zhí)行哪些測(cè)試方法,可以一鍵執(zhí)行全部測(cè)試方法。
  • Junit可以生成全部方法的測(cè)試報(bào)告。
  • 單元測(cè)試中的某個(gè)方法測(cè)試失敗了,不會(huì)影響其他測(cè)試方法的測(cè)試。

1.4?單元測(cè)試快速入門

步驟

第一步:將Junit的jar包導(dǎo)入到項(xiàng)目中。

25.單元測(cè)試、反射

第二步:編寫測(cè)試方法:該測(cè)試方法必須是公共的無參數(shù)無返回值的非靜態(tài)方法。

第三步:在測(cè)試方法上使用@Test注解,標(biāo)注該方法是一個(gè)測(cè)試方法

第四步:在測(cè)試方法中完成被測(cè)試方法的預(yù)期正確性測(cè)試。

第五步:選中測(cè)試方法,選擇“JUnit運(yùn)行” ,如果測(cè)試良好則是綠色;如果測(cè)試失敗,則是紅色

1.5?Junit常用注解

Junit常用注解(Junit 4.xxxx版本):

25.單元測(cè)試、反射

Junit常用注解(Junit 5.xxxx版本):

25.單元測(cè)試、反射

1.6?代碼實(shí)例

25.單元測(cè)試、反射

二.反射

2.1?反射概述

反射是指對(duì)于任何類,在運(yùn)行的時(shí)候,可以獲取類的字節(jié)碼文件對(duì)象,然后可以解析類中的全部成分。例如,在運(yùn)行時(shí),可以得到:

  • 類的構(gòu)造器對(duì)象:Construtor
  • 類的成員變量對(duì)象:Field
  • 類的成員方法對(duì)象:Method

這種運(yùn)行時(shí)動(dòng)態(tài)獲取類信息以及動(dòng)態(tài)調(diào)用類中成分的能力稱為反射。

2.2?反射的關(guān)鍵

加載完類之后,在堆內(nèi)存的方法區(qū)中就產(chǎn)生了一個(gè)Class類型的對(duì)象,一個(gè)類只有一個(gè)Class對(duì)象,這個(gè)對(duì)象就包含了完整的類的結(jié)構(gòu)信息。我們可以通過這個(gè)對(duì)象看到類的結(jié)構(gòu)。這個(gè)對(duì)象就像一面鏡子,透過這個(gè)鏡子看到類的結(jié)構(gòu),所以,我們形象的稱之為:反射。

  • 正常方式:類 =》通過new實(shí)例化 =》取得實(shí)例化對(duì)象
  • 反射方式:實(shí)例化對(duì)象 =》getClass()方法 =》得到類完整的結(jié)構(gòu)

反射的第一步都是先得到編譯后的Class文件對(duì)象,然后就可以得到Class的全部成分。

25.單元測(cè)試、反射

2.3?反射獲取類對(duì)象

獲取Class類的對(duì)象,共有三種方式:

  • 方式一:使用Class類中的靜態(tài)方法forName,裝入類,并做類的靜態(tài)初始化,返回Class的對(duì)象代碼格式如下:Class?c1 =?Class.forName("全類名");//全類名就是 src 下的全包名
  • 方式二:JVM將使用類加載器,將類加載到內(nèi)存,但前提是類還沒有裝入內(nèi)存,不做類的初始化工作,返回Class的對(duì)象,代碼格式如下:?Class?c2 =?類名.Class;
  • 方式三:使用Object類中的getClass方法獲取,會(huì)對(duì)類進(jìn)行靜態(tài)初始化,代碼格式如下:? ? Class?c3 =?對(duì)象.getClass();

25.單元測(cè)試、反射

25.單元測(cè)試、反射

2.4?反射獲取構(gòu)造器對(duì)象

步驟:

  1. 首先得到類對(duì)象
  2. 通過類對(duì)象獲取構(gòu)造器對(duì)象
  3. 使用構(gòu)造器對(duì)象創(chuàng)建類的對(duì)象

25.單元測(cè)試、反射

Class類中用于獲取構(gòu)造器的方法:

25.單元測(cè)試、反射

Constructor類中用于創(chuàng)建對(duì)象的方法:

25.單元測(cè)試、反射

作用

獲取構(gòu)造器的作用依然是獲取一個(gè)對(duì)象并返回。

注意事項(xiàng)

如果某個(gè)構(gòu)造器是私有的,那么需要打開權(quán)限(暴力反射),然后再創(chuàng)建對(duì)象。

范例

public class TestDemo {
????//目標(biāo):掌握如何獲取構(gòu)造器對(duì)象,并利用構(gòu)造器對(duì)象創(chuàng)建對(duì)象

????//獲取所有公共的構(gòu)造器對(duì)象
????@Test
????public void getConstructors(){
????????//1.獲得類對(duì)象
????????Class class1 = Student.class;
????????//2.獲得所有公共構(gòu)造器對(duì)象
????????Constructor[] constructors = class1.getConstructors();
????????//3.遍歷構(gòu)造器數(shù)組
????????for (Constructor constructor : constructors) {
????????????System.out.println(constructor.getName()+"===>"+constructor.getParameterCount());
????????}
????}

????//獲取所有的構(gòu)造器對(duì)象,無論構(gòu)造器是公開的,還是私有的
????@Test
????public void getDeclaredConstructors(){
????????//1.獲取類對(duì)象
????????Class class2 = Student.class;
????????//2.獲取所有構(gòu)造器對(duì)象
????????Constructor[] allConstructor = class2.getDeclaredConstructors();
????????//3.遍歷構(gòu)造器對(duì)象
????????for (Constructor constructor : allConstructor) {
????????????System.out.println(constructor.getName()+"===>"+constructor.getParameterCount());
????????}
????}

????//獲取單個(gè)構(gòu)造器對(duì)象
????@Test
????public void getConstructor() throws Exception{
????????//1.獲取類對(duì)象
????????Class class3 = Student.class;
????????//2.獲取單個(gè)構(gòu)造器
????????Constructor constructor = class3.getDeclaredConstructor(String.class,int.class);
????????constructor.setAccessible(true);
????????//3.通過這個(gè)構(gòu)造器創(chuàng)建對(duì)象
????????Student s = (Student) constructor.newInstance("張三",12);
????????System.out.println(s);

????}

????//獲取單個(gè)構(gòu)造器對(duì)象,無視構(gòu)造器的訪問權(quán)限
????@Test
????public void getDeclaredConstructor() throws Exception{
????????//1.獲取類對(duì)象
????????Class class3 = Student.class;
????????//2.獲取單個(gè)構(gòu)造器
????????Constructor constructor = class3.getDeclaredConstructor();
????????//3.暴力反射
????????constructor.setAccessible(true);
????????//4.通過這個(gè)構(gòu)造器創(chuàng)建對(duì)象
????????Student student = (Student) constructor.newInstance();
????????System.out.println(student);
????}
}

2.5?反射獲取成員變量對(duì)象

步驟:

  1. 首先得到類對(duì)象
  2. 從類對(duì)象中獲取成員變量對(duì)象

25.單元測(cè)試、反射

Class類中用于獲取成員變量的方法:

25.單元測(cè)試、反射

Field中用于取值、賦值的方法

25.單元測(cè)試、反射

作用

依然是為某個(gè)對(duì)象中對(duì)應(yīng)的成員變量取值和賦值。

注意事項(xiàng)

如果某個(gè)成員變量是私有的,那么需要打開權(quán)限(暴力反射),然后再取值、賦值。

代碼示例

public class FieldDemo1 {
????//目標(biāo):掌握成員變量對(duì)象的獲取,并對(duì)某個(gè)對(duì)象中相應(yīng)的成員變量進(jìn)行取值和賦值

????//通過反射獲取所有成員變量對(duì)象
????@Test
????public void getFields() throws Exception {
????????//1.獲取類對(duì)象
????????Class class1 = Student.class;
????????//2.獲取所有成員變量對(duì)象
????????Field[] fields = class1.getDeclaredFields();
????????//3.遍歷所有成員變量對(duì)象
????????for (Field field : fields) {
????????????System.out.println(field.getName()+"===>"+field.getType());
????????}

????}

????//通過反射獲取一個(gè)成員變量并賦值
????@Test
????public void getField() throws Exception {
????????//1.獲取類對(duì)象
????????Class class1 = Student.class;
????????//2.獲取成員變量對(duì)象
????????Field name = class1.getDeclaredField("name");
????????//3.暴力反射
????????name.setAccessible(true);
????????//4.對(duì)成員變量賦值
????????Student s = new Student();
????????name.set(s,"張三");
????????//5.打印對(duì)象
????????System.out.println(s);
????}

????//通過反射獲取一個(gè)成員變量并取值
????@Test
????public void getField2() throws Exception {
????????//1.獲取類對(duì)象
????????Class class1 = Student.class;
????????//2.獲取成員變量對(duì)象
????????Field name = class1.getDeclaredField("name");
????????//3.暴力反射
????????name.setAccessible(true);
????????//4.對(duì)成員變量取值
????????Student s = new Student("李四",12);
????????String s1 = (String) name.get(s);
????????//5.打印成員變量
????????System.out.println(s1);
????}
}

2.6?反射獲取成員方法對(duì)象

步驟:

  1. 首先獲取類對(duì)象
  2. 通過類對(duì)象獲取Method對(duì)象
  3. 運(yùn)行方法

25.單元測(cè)試、反射

Class類中用于獲取成員方法的方法:

25.單元測(cè)試、反射

Method類中用于觸發(fā)執(zhí)行的方法:

25.單元測(cè)試、反射

作用

獲取成員方法的作用依然是在某個(gè)對(duì)象中執(zhí)行此方法

注意事項(xiàng)

如果某個(gè)成員方法是私有的,那么需要通過暴力反射打開權(quán)限,然后再執(zhí)行此方法。

2.6?反射的作用

2.6.1 繞過編譯階段為集合添加數(shù)據(jù)

反射是作用在運(yùn)行時(shí)的技術(shù),此時(shí)集合的泛型將不能產(chǎn)生約束了,此時(shí)可以為集合存入其他任意類型的元素。

1.原因

泛型只是在編譯階段可以約束集合只能操作某種數(shù)據(jù)類型,在編譯成Class文件進(jìn)入運(yùn)行階段的時(shí)候,其真實(shí)類型都是不帶泛型的集合類型了,泛型相當(dāng)于被擦除了。

2.代碼示例文章來源地址http://www.zghlxwxcb.cn/news/detail-497077.html

25.單元測(cè)試、反射

2.6.2 通用框架的底層原理

1.需求: 給你任意一個(gè)對(duì)象,在不清楚對(duì)象字段的情況可以把對(duì)象的字段名稱和對(duì)應(yīng)值存儲(chǔ)到文件中去。

25.單元測(cè)試、反射

2.代碼示例

//框架代碼:
public class MyBatisUtils {
????public static void save(Object o){
????????try (
????????????????PrintStream ps = new PrintStream(new FileOutputStream("junit-reflect-annotation-proxy/src/reflect.txt",true))
????????????????){
????????????//1.得到類對(duì)象
????????????Class aClass = o.getClass();
????????????ps.println("================="+aClass.getSimpleName()+"=================");
????????????//2.得到類中全部的成員變量對(duì)象
????????????Field[] fields = aClass.getDeclaredFields();
????????????//3.得到全部成員變量對(duì)象的名字和值

????????????for (Field field : fields) {
????????????????field.setAccessible(true);
????????????????String name = field.getName();
????????????????String??value = field.get(o)+" ";
????????????????//4.保存到文件中
????????????????ps.println(name+"---"+value);
????????????}
????????} catch (Exception e) {
????????????e.printStackTrace();
????????}
????}
}

//測(cè)試代碼:
public class ReflectDemo1 {
????public static void main(String[] args) {
????????//目標(biāo):利用反射技術(shù),做一個(gè)通用框架
????????//向?qū)ο笾刑砑訑?shù)據(jù),并將對(duì)象傳到框架中
????????Student s = new Student("張三",17,'男',12,"3000");
????????MyBatisUtils.save(s);

????????Tercher t = new Tercher("張三",17,'男',"王標(biāo)");
????????MyBatisUtils.save(t);

????}
}

到了這里,關(guān)于25.單元測(cè)試、反射的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • java的單元測(cè)試和反射

    java的單元測(cè)試和反射

    就是針對(duì)最小的功能單元,編寫測(cè)試代碼對(duì)其進(jìn)行正確性測(cè)試 Junit單元測(cè)試框架: 可以用來對(duì)方法進(jìn)行測(cè)試 有點(diǎn): 可以靈活的編寫測(cè)試代碼,可以針對(duì)某個(gè)方法進(jìn)行測(cè)試,也支持一鍵完成對(duì)全部方法的自動(dòng)發(fā)測(cè)試,且各自獨(dú)立 測(cè)試的方法必須是 公共,無參,無返回值 測(cè)試

    2024年04月28日
    瀏覽(14)
  • 【JAVA】單元測(cè)試、反射、注解、動(dòng)態(tài)代理

    @Test 測(cè)試方法 @Before 用來修飾實(shí)例方法,該方法會(huì)在每一個(gè)測(cè)試方法執(zhí)行之前執(zhí)行一次。 @After 用來修飾實(shí)例方法,該方法會(huì)在每一個(gè)測(cè)試方法執(zhí)行之后執(zhí)行一次。 @Before Class 用來靜態(tài)修飾方法,該方法會(huì)在所有測(cè)試方法之前只執(zhí)行一次。 @After Class 用來靜態(tài)修飾方法,該方法

    2024年02月11日
    瀏覽(20)
  • Java高級(jí)技術(shù):?jiǎn)卧獪y(cè)試、反射、注解

    Java高級(jí)技術(shù):?jiǎn)卧獪y(cè)試、反射、注解

    目錄 單元測(cè)試 單元測(cè)試概述 單元測(cè)試快速入門 單元測(cè)試常用注解 反射 反射概述 反射獲取類對(duì)象 反射獲取構(gòu)造器對(duì)象 反射獲取成員變量對(duì)象 反射獲取方法對(duì)象 反射的作用-繞過編譯階段為集合添加數(shù)據(jù) 反射的作用-通用框架的底層原理 注解 注解概述 自定義注解 元注解

    2024年01月16日
    瀏覽(21)
  • Java SE 學(xué)習(xí)筆記(十七)—— 單元測(cè)試、反射

    Java SE 學(xué)習(xí)筆記(十七)—— 單元測(cè)試、反射

    開發(fā)好的系統(tǒng)中存在很多方法,如何對(duì)這些方法進(jìn)行測(cè)試? 以前我們都是將代碼全部寫完再進(jìn)行測(cè)試。其實(shí)這樣并不是很好。在以后工作的時(shí)候,都是寫完一部分代碼,就測(cè)試一部分。這樣,代碼中的問題可以得到及時(shí)修復(fù)。也避免了由于代碼過多,從而無法準(zhǔn)確定位到錯(cuò)誤

    2024年02月06日
    瀏覽(24)
  • 現(xiàn)代C++編程實(shí)戰(zhàn)25-兩個(gè)單元測(cè)試庫(kù):C++里如何進(jìn)行單元測(cè)試

    現(xiàn)代C++編程實(shí)戰(zhàn)25-兩個(gè)單元測(cè)試庫(kù):C++里如何進(jìn)行單元測(cè)試

    你好,我是吳詠煒。 單元測(cè)試已經(jīng)越來越成為程序員工作密不可分的一部分了。在 C++ 里,我們當(dāng)然也是可以很方便地進(jìn)行單元測(cè)試的。今天,我就來介紹兩個(gè)單元測(cè)試庫(kù):一個(gè)是 Boost.Test [1],一個(gè)是 Catch2 [2]。 單元測(cè)試庫(kù)有很多,我選擇 Boost 的原因我在上一講已經(jīng)說過:“

    2024年02月07日
    瀏覽(22)
  • mockito+junit 單元測(cè)試 測(cè)試私有方法利用反射去調(diào)用提升覆蓋率 反射調(diào)用時(shí)傳入?yún)?shù)為 null

    今天公司安排我寫單元測(cè)試 因?yàn)橐ㄟ^三級(jí)認(rèn)證 公司要求是覆蓋率必須達(dá)到100% 而在寫單元測(cè)試的時(shí)候 對(duì)于是否要測(cè)試私有方法一直是一個(gè)爭(zhēng)議 公司規(guī)范 對(duì)私有方法也進(jìn)行測(cè)試 代碼如下: JudgeUtils 是公司封裝的一個(gè)工具類 讓我們看看 isNull 方法的內(nèi)部 代碼如下: 我現(xiàn)在需

    2024年02月11日
    瀏覽(28)
  • Day20-【Java SE高級(jí)】單元測(cè)試 反射 注解 動(dòng)態(tài)代理

    Day20-【Java SE高級(jí)】單元測(cè)試 反射 注解 動(dòng)態(tài)代理

    就是針對(duì)最小的功能單元(方法),編寫測(cè)試代碼對(duì)其進(jìn)行正確性測(cè)試。 1. 咱們之前是如何進(jìn)行單元測(cè)試的?有啥問題? 只能在main方法編寫測(cè)試代碼,去調(diào)用其他方法進(jìn)行測(cè)試。 無法實(shí)現(xiàn)自動(dòng)化測(cè)試,一個(gè)方法測(cè)試失敗,可能影響其他方法的測(cè)試。 無法得到測(cè)試的報(bào)告,需要程

    2024年04月17日
    瀏覽(22)
  • 針對(duì)mockito框架在單元測(cè)試中出現(xiàn)Mybatis-Plus鏈?zhǔn)秸{(diào)用的解決方案

    1、 調(diào)用其他service層方法 2、 調(diào)用本service層方法 3、其他問題

    2024年01月24日
    瀏覽(25)
  • Linux環(huán)境下,針對(duì)QT軟件工程搭建C++Test單元測(cè)試環(huán)境的操作指南

    Linux環(huán)境下,針對(duì)QT軟件工程搭建C++Test單元測(cè)試環(huán)境的操作指南

    C++Test是Parasoft公司出品的一款可以針對(duì)C/C++源代碼進(jìn)行靜態(tài)分析、單元測(cè)試、集成測(cè)試的測(cè)試工具。本文主要講解如何在Linux環(huán)境下,搭建QT插件版的C++Test測(cè)試環(huán)境。 1、在官網(wǎng)上下載Linux環(huán)境下的QT庫(kù)和QT Creator: 2、先安裝依賴文件: 3、解壓QT庫(kù)安裝包: 4、配置(用于生成

    2024年01月19日
    瀏覽(41)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包