java測試私有方法被定義為具有私有訪問修飾符的方法,並且僅限於在定義類別中訪問,並且在其子類別中不可見,因為它們不符合重寫的條件,但是,我們可以定義子類別中具有相同名稱的方法並且可以在父類別中訪問,還可以透過將私有方法套件存取來測試私有方法,這允許我們直接使用JUnit 從同一套件中的測試類別中測試它們,但測試SuiteRunner 中的私有方法比JUnit 中的測試更容易。
開始您的免費軟體開發課程
網頁開發、程式語言、軟體測試及其他
無論您使用 JUnit 或 SuiteRunner,我們都有四種基本方法來測試私有方法,
有時私有方法正在執行非常複雜的任務,並且測試應該經過很好的測試,因此我們不希望使用者有權存取這些方法,因為私有方法需要受到保護。
私有方法不能間接測試,只能測試它們對呼叫它們的公共方法的影響。測試私有方法可能表示這些方法已移至另一個有助於/支援可重用性的類別中。
如果我們從中提取已經運行並且具有良好單元測試覆蓋率的私有方法,那麼該方法已經存在於足以測試的單元測試中,因此我們不需要為私有方法編寫更多的單元測試。但是如果我們想在呼叫方法之前編寫私有方法,並且希望在編寫私有方法之前先編寫單元測試。
範例
public class testClass { private String testMethod(String s) { return s; } }
上面的範例僅用於測試私有方法。如果我們有一個類別“testClass”,那麼它被“testMethod( )”方法調用,那麼該方法是私有的,透過傳遞字串或物件我們可以傳回值。
提供方法包存取權對於使用 JUnit 測試私有方法來說效果很好,但成本稍高。當一個方法具有私有存取修飾符時,它就是該類別實作的一部分。如果我們只是嘗試使用套件中另一個類中的類,我們可以忽略該方法,並且可以透過使用套件存取方法來解決這個問題。另外,可以使用方法存取套件來測試類別的非公共方法。
第一種方法是將方法包設為私有,不使用存取修飾符,並將測試放入同一個包中,這是一種常見的方法,但如果我們想要其他程式碼,那麼第二種方法是將方法設為公用。
在java中測試私有方法的第三件事是使用嵌套測試類,它可以透過在被測試的生產類中嵌套一個靜態類別來完成。嵌套類別可以存取其封閉類別的私有成員,它可以直接呼叫私有方法。靜態類別本身可以是套件訪問,使其成為白盒測試的載入部分。
這個嵌套測試類的缺點是,如果我們不希望在我們的部門 JAR 檔案中存取嵌套類,那麼我們需要做額外的工作來提取它。這可能會出現問題,因為品質分析師會更改原始程式碼。
現在來討論反射的下一個用途。使用反射來測試私有方法的優點是它提供了測試程式碼和生產程式碼的清晰分離。正如我們在嵌套類別方法中已經看到的那樣,測試不需要在類別內部進行測試,其中類別正在接受測試,但它們可以與執行類別的套件層級和公共方法的其他測試放在一起。由於我們使用嵌套類,因此我們不需要在套件存取層級添加任何額外的嵌套類別。
反射是一個 API,用於在執行時間檢查或修改方法、類別、介面的行為。使用反射的缺點是測試程式碼要繁瑣得多,因為它使用了反射 API。
範例:描述反射使用的Java程式
代碼:
import java.lang.reflect.Method; import java.lang.reflect.Field; class Test { private String s; public Test() { s = "Java Testing Methods"; } public void method1() { System.out.println("The string is " + s); } public void method2(int n) { System.out.println("The number is " + n); } private void method3() { System.out.println("Private method invoked"); } } class Reflect { public static void main(String args[]) throws Exception { Test obj = new Test(); Class cls = obj.getClass(); System.out.println("The name of class is " + cls.getName()); System.out.println("The public methods of class are : "); Method[] methods = cls.getMethods(); for (Method method:methods) System.out.println(method.getName()); Method methodcall1 = cls.getDeclaredMethod("method2", int.class); methodcall1.invoke(obj, 19); Field field = cls.getDeclaredField("s"); field.setAccessible(true); field.set(obj, "JAVA"); Method methodcall2 = cls.getDeclaredMethod("method1"); methodcall2.invoke(obj); Method methodcall3 = cls.getDeclaredMethod("method3"); methodcall3.setAccessible(true); methodcall3.invoke(obj); } }
輸出:
在上面的java程式中,首先,我們必須導入java.lang包,然後在類別中建立一個私有字段,並建立建構函式。 method1() 已被視為不帶參數的公共方法,然後創建了method2() 也是一個公共方法,但帶有整數參數和私有方法method3 已被撤銷,上述三個方法在Reflect 類別中調用,輸出如上所示截圖。
在本文中,我們得出的結論是,我們不應該直接測試私有方法,而只測試它們對呼叫它們的公共方法的影響。此外,我們得出的結論是測試應該只存取類別的公共介面。如果我們測試私有方法,則將反射程式碼安排到私人靜態類別中。
以上是Java 測試私有方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!