我有一個類負責將合約從CSV導入數據庫。有很多私有方法的Java測試類
類本身只有一個啓動進口和其他方法都是私有的(因爲只有類本身會用,而他們,保持邏輯)的公共方法。
我開始讓使用斯波克和有很多私人的方法這個類的測試,我應該怎麼測試呢?
我應該將它們變成公開測試嗎?只測試主要的方法,公共的一個?
什麼是最好的?
我有一個類負責將合約從CSV導入數據庫。有很多私有方法的Java測試類
類本身只有一個啓動進口和其他方法都是私有的(因爲只有類本身會用,而他們,保持邏輯)的公共方法。
我開始讓使用斯波克和有很多私人的方法這個類的測試,我應該怎麼測試呢?
我應該將它們變成公開測試嗎?只測試主要的方法,公共的一個?
什麼是最好的?
從理論上講,你的私有方法最終將被一種公共方法所使用,否則它們根本不會被使用。因此,通常你會設置你的測試以調用具有必要上下文的公共方法,以便它觸及你的私有方法。
單元測試主要是測試編譯單元(即類)。你可以直接對單元測試方法進行單元測試,但是必須公開,這不利於使用乾淨的API。
因此,測試你的公共方法足以擊中所有的私人方法。私有方法是類的內部機制,它們不需要直接進行測試。
Thx,我會像那樣測試! – 2015-01-15 18:16:28
有些人認爲,你應該只測試你的API(即。您的公共方法)。
一個可能的解決方案是使用package private,以便只有同一個包中的類才能訪問這些方法。
就我個人而言,我不會測試私有方法,我會專注於按預期行事的公共方法。 如果你覺得你的私有方法承載了太多的重量,那麼他們可能會這樣做,你應該進一步分離功能。
如果你的類實現一個接口,你可以讓你喜歡的測試「公共」的所有方法,但不添加它們的接口。在這種情況下,您將能夠從測試中訪問這些方法,但不能從您的src中訪問。
您可以使用反射來實現此目的。 Method類有一個名爲setAccessible(boolean)的方法,即使聲明爲private/protected/default,也可以調用它。請參閱下面的示例:
YourClass yourClassInstance = new YourClass();
Method yourMethod = YourClass.class.getDeclaredMethod("yourMethod", null);
yourMethod.setAccessible(true);
Object[] parameters = new Object[1];
parameters[0] = "A String parameter";
Object result = yourMethod.invoke(yourClassInstance, parameters);
如果您需要對這些方法運行JUnit測試,它們需要是「public」。這會導致任何問題嗎? – Ascalonian 2015-01-15 18:00:04
您可以將這些私有方法變成包方法(而不是公共方法),然後您的測試必須位於同一個包中。 – Gus 2015-01-15 18:00:31
我推薦閱讀這個SO帖子:http://stackoverflow.com/questions/105007/should-i-test-private-methods-or-only-public-ones – 2015-01-15 18:00:34