国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

[深入JUnit] 為什么別測試private函數

happyhuangjinjin / 2777人閱讀

摘要:比如說,是我們要測試的,它有以及的方法。對這個而言,它可見的所有函數,是的返回值。非法,不能調用的私有函數。與其實區別不大。或者,也許這個函數其實應該被聲明稱。那么,根據原則,這個函數就應該被放到一個多帶帶的里面。然后,對進行測試。

比如說,Bird是我們要測試的class,它有public, protected,以及private的方法。

// 文件位置:src/test/sample/Bird.java
package test.sample;
class Bird {
  public void fly() { ... }
  public void eat() { ... }
  protected void singRandomly() { 
    final Song s = findASong();
    singASong(s);
  }
  
  private Song findASong() { ... }
  private void singASong() { ... }
}

現在有一個BirdTest class。對這個class而言,它可見的所有函數,是Bird.class.getDeclaredMethods()的返回值。

代碼細節請看
junit.internal.MethodSorter#getDeclaredMethods()
http://grepcode.com/file/repo1.maven.org/maven2/junit/junit/4.12/org/junit/internal/MethodSorter.java#MethodSorter.getDeclaredMethods%28java.lang.Class%29
以及java.lang.Class#getDeclaredMethods()
http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b27/java/lang/Class.java#Class.getDeclaredMethods%28%29

所有的public, protected, private方法BirdTest都能看到。但是,看到不等于能調用

// 文件位置:tst/test/sample/BirdTest.java
package test.sample;
class BirdTest {
  @Test
  public void testFly_CaseDescription1() {
    ...
    bird.fly(); //當然ok,因為Bird#fly是public的
  }

  @Test
  public void testSingRandomly_CaseDescription1() {
    ... 
    bird.sing(); //ok,因為BirdTest也在test.sample package下面。否則是非法的。
  }

  @Test
  public void testFindASong() {
    ...
    bird.findASong(); // 非法,不能調用Bird的私有函數。
  }
}

在上面的代碼里,由于BirdTestBird在一個package test.sample里,所以Bird所有的publicprotected函數,對BirdTest可見。但是,private應該是不可調用的。

當然,有人會告訴你如何利用java reflection的API來讓private method也可以調用

// 無關緊要的parameter用 "_" 略去了
Method findASong = targetClass.getDeclaredMethod("findASong", _);
findASong.setAccessible(true);
return findASong.invoke(_, _);

但是,這打破了Bird類的封裝,是非常不好的。設想,改動private的方法的聲明會造成test failure,那么private就失去意義了。與protected其實區別不大。

那么應該怎么做呢?

不去測試private函數,好的private函數都應該是很小很簡單的,測試那調用了private函數的public和protected方法即可。

或者,也許這個private函數其實應該被聲明稱protected。

如果以上方法你都覺得不合適,而某一個private函數很復雜,很需要測試。那么,根據Single Responsibility原則,這個private函數就應該被放到一個多帶帶的class里面。

class BirdSongs {
  protected Song findASong(Integer id) { ... }
  protected void singASong(Song s) { ... }
}

然后,對BirdSongs#findASong進行測試。

如果您有不同意見,歡迎與我討論。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/65678.html

相關文章

  • [深入JUnit] 測試運行的入口

    摘要:劇透如果您看了深入的秘密,里面的是通過本文涉及到的,一個叫的類,與連接到一起的。是今天的主角比如說我們有一個類,如何調用來運行測試有一個的類,他的描述是所以,這個是運行測試的一個入口。接下來,打算轉戰倡導。 showImg(https://segmentfault.com/img/bVtSbH); 閱讀前提 了解JUnit 對JUnit的內部實現有興趣 不妨看看[深入JUnit] @...

    springDevBird 評論0 收藏0
  • [深入JUnit] 測試運行的入口

    摘要:劇透如果您看了深入的秘密,里面的是通過本文涉及到的,一個叫的類,與連接到一起的。是今天的主角比如說我們有一個類,如何調用來運行測試有一個的類,他的描述是所以,這個是運行測試的一個入口。接下來,打算轉戰倡導。 showImg(https://segmentfault.com/img/bVtSbH); 閱讀前提 了解JUnit 對JUnit的內部實現有興趣 不妨看看[深入JUnit] @...

    godlong_X 評論0 收藏0
  • 深入理解 lambda表達式 與 MethodReference(四)

    摘要:陳楊一測試數據準備二方法引用引入方法引用集合遍歷集合遍歷集合遍歷集合遍歷三什么是 package com.java.design.java8.MethodReference; import com.java.design.java8.entity.Student; import org.junit.Before; import org.junit.Test; import org....

    EasonTyler 評論0 收藏0
  • [深入JUnit] @Before, @After, @Test的秘密

    摘要:最近對和的內部實現比較感興趣,將在接下來的一段時間,和大家一起深入代碼細節。利用原生的和,可以輕松地得到測試類中函數的。下期內容又被誰調用了呢運行的入口在哪里請看深入測試運行的入口 最近對JUnit和Mockito的內部實現比較感興趣,將在接下來的一段時間,和大家一起深入代碼細節。 王侯將相,寧有種乎 (JUnit也沒啥Magic吧) 閱讀前提 聽說過Java Annotation ...

    dongfangyiyu 評論0 收藏0
  • 一起來學SpringBoot | 第五篇:使用JdbcTemplate訪問數據庫

    摘要:值得注意的是,默認會自動配置,它將優先采用連接池,如果沒有該依賴的情況則選取,如果前兩者都不可用最后選取。 SpringBoot 是為了簡化 Spring 應用的創建、運行、調試、部署等一系列問題而誕生的產物,自動裝配的特性讓我們可以更好的關注業務本身而不是外部的XML配置,我們只需遵循規范,引入相關的依賴就可以輕易的搭建出一個 WEB 工程 Spring Framework對數據...

    ssshooter 評論0 收藏0

發表評論

0條評論

happyhuangjinjin

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<