摘要:比如說,是我們要測試的,它有以及的方法。對這個(gè)而言,它可見的所有函數(shù),是的返回值。非法,不能調(diào)用的私有函數(shù)。與其實(shí)區(qū)別不大?;蛘撸苍S這個(gè)函數(shù)其實(shí)應(yīng)該被聲明稱。那么,根據(jù)原則,這個(gè)函數(shù)就應(yīng)該被放到一個(gè)多帶帶的里面。然后,對進(jìn)行測試。
比如說,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() { ... } }
現(xiàn)在有一個(gè)BirdTest class。對這個(gè)class而言,它可見的所有函數(shù),是Bird.class.getDeclaredMethods()的返回值。
代碼細(xì)節(jié)請看
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都能看到。但是,看到不等于能調(diào)用。
// 文件位置:tst/test/sample/BirdTest.java package test.sample; class BirdTest { @Test public void testFly_CaseDescription1() { ... bird.fly(); //當(dāng)然ok,因?yàn)锽ird#fly是public的 } @Test public void testSingRandomly_CaseDescription1() { ... bird.sing(); //ok,因?yàn)锽irdTest也在test.sample package下面。否則是非法的。 } @Test public void testFindASong() { ... bird.findASong(); // 非法,不能調(diào)用Bird的私有函數(shù)。 } }
在上面的代碼里,由于BirdTest與Bird在一個(gè)package test.sample里,所以Bird所有的public和protected函數(shù),對BirdTest可見。但是,private應(yīng)該是不可調(diào)用的。
當(dāng)然,有人會(huì)告訴你如何利用java reflection的API來讓private method也可以調(diào)用
// 無關(guān)緊要的parameter用 "_" 略去了 Method findASong = targetClass.getDeclaredMethod("findASong", _); findASong.setAccessible(true); return findASong.invoke(_, _);
但是,這打破了Bird類的封裝,是非常不好的。設(shè)想,改動(dòng)private的方法的聲明會(huì)造成test failure,那么private就失去意義了。與protected其實(shí)區(qū)別不大。
那么應(yīng)該怎么做呢?
不去測試private函數(shù),好的private函數(shù)都應(yīng)該是很小很簡單的,測試那調(diào)用了private函數(shù)的public和protected方法即可。
或者,也許這個(gè)private函數(shù)其實(shí)應(yīng)該被聲明稱protected。
如果以上方法你都覺得不合適,而某一個(gè)private函數(shù)很復(fù)雜,很需要測試。那么,根據(jù)Single Responsibility原則,這個(gè)private函數(shù)就應(yīng)該被放到一個(gè)多帶帶的class里面。
class BirdSongs { protected Song findASong(Integer id) { ... } protected void singASong(Song s) { ... } }
然后,對BirdSongs#findASong進(jìn)行測試。
如果您有不同意見,歡迎與我討論。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/65678.html
摘要:劇透如果您看了深入的秘密,里面的是通過本文涉及到的,一個(gè)叫的類,與連接到一起的。是今天的主角比如說我們有一個(gè)類,如何調(diào)用來運(yùn)行測試有一個(gè)的類,他的描述是所以,這個(gè)是運(yùn)行測試的一個(gè)入口。接下來,打算轉(zhuǎn)戰(zhàn)倡導(dǎo)。 showImg(https://segmentfault.com/img/bVtSbH); 閱讀前提 了解JUnit 對JUnit的內(nèi)部實(shí)現(xiàn)有興趣 不妨看看[深入JUnit] @...
摘要:劇透如果您看了深入的秘密,里面的是通過本文涉及到的,一個(gè)叫的類,與連接到一起的。是今天的主角比如說我們有一個(gè)類,如何調(diào)用來運(yùn)行測試有一個(gè)的類,他的描述是所以,這個(gè)是運(yùn)行測試的一個(gè)入口。接下來,打算轉(zhuǎn)戰(zhàn)倡導(dǎo)。 showImg(https://segmentfault.com/img/bVtSbH); 閱讀前提 了解JUnit 對JUnit的內(nèi)部實(shí)現(xiàn)有興趣 不妨看看[深入JUnit] @...
摘要:陳楊一測試數(shù)據(jù)準(zhǔn)備二方法引用引入方法引用集合遍歷集合遍歷集合遍歷集合遍歷三什么是 package com.java.design.java8.MethodReference; import com.java.design.java8.entity.Student; import org.junit.Before; import org.junit.Test; import org....
摘要:最近對和的內(nèi)部實(shí)現(xiàn)比較感興趣,將在接下來的一段時(shí)間,和大家一起深入代碼細(xì)節(jié)。利用原生的和,可以輕松地得到測試類中函數(shù)的。下期內(nèi)容又被誰調(diào)用了呢運(yùn)行的入口在哪里請看深入測試運(yùn)行的入口 最近對JUnit和Mockito的內(nèi)部實(shí)現(xiàn)比較感興趣,將在接下來的一段時(shí)間,和大家一起深入代碼細(xì)節(jié)。 王侯將相,寧有種乎 (JUnit也沒啥Magic吧) 閱讀前提 聽說過Java Annotation ...
摘要:值得注意的是,默認(rèn)會(huì)自動(dòng)配置,它將優(yōu)先采用連接池,如果沒有該依賴的情況則選取,如果前兩者都不可用最后選取。 SpringBoot 是為了簡化 Spring 應(yīng)用的創(chuàng)建、運(yùn)行、調(diào)試、部署等一系列問題而誕生的產(chǎn)物,自動(dòng)裝配的特性讓我們可以更好的關(guān)注業(yè)務(wù)本身而不是外部的XML配置,我們只需遵循規(guī)范,引入相關(guān)的依賴就可以輕易的搭建出一個(gè) WEB 工程 Spring Framework對數(shù)據(jù)...
閱讀 3773·2021-09-22 15:17
閱讀 1960·2021-09-22 14:59
閱讀 2357·2020-12-03 17:00
閱讀 3222·2019-08-30 15:55
閱讀 495·2019-08-30 11:23
閱讀 3496·2019-08-29 13:56
閱讀 528·2019-08-29 12:54
閱讀 2266·2019-08-29 12:49