[英]How do I test Java code that uses JAR?
我有使用JAR的Java代碼:
public class Version {
public String getVersion() {
// Use Java Package API to return information specified in the manifest of this JAR.
return getClass().getPackage().getImplementationVersion();
}
}
如何為此代碼運行JUnit測試?
由於尚無JAR文件,因此它在開發構建中(在Eclipse中)失敗。
由於沒有JAR文件,因此無法在生產版本中(在Gradle中)。
您始終需要模擬依賴項以進行單元測試。 邊界是單元測試您的代碼,而不是jar本身。 Mockito框架很好,還有其他框架可以完成任務。
很有可能無法正確模擬(因此:未經單元測試)。 關鍵是您實際上是在“ this”上調用方法。 但是您不能測試某些對象……並同時對其進行模擬。
您會看到,如果您的生產代碼如下所示:
public String getVersion() {
return someObject.getClass().....
}
然后可以創建一個模擬對象; 並將其插入到Version類中。 但是即使那樣,方法getClass()在java.lang.Object中還是最終的 ; 因此,無論如何您都不能嘲笑它。
[諸如EasyMock或Mokito之類的合理的模擬框架通過擴展類並覆蓋要控制的方法來工作。 像PowerMock這樣的框架可以進行字節碼操作,並允許進行這種模擬-但是您永遠都不要使用此類庫。 因為它們確實有嚴重的副作用(例如破壞大多數coverage庫)]
可能有效的方法:
class Version {
private final Package packageForVersionCheck;
public Version() {
this(getClass().getPackage()));
}
Version(Package somePackage) {
this.packageForVersionCheck = ...
}
public String getVersion() {
return this.packageForVersionCheck.getImpl....
現在,您可以使用依賴項注入來提供一個返回該字符串的“模擬”包。 但是,看起來好像很多代碼幾乎沒有收獲。
長話短說:有時,您根本無法編寫合理的單元測試。 然后做下一個最好的事情:創建一些“功能”測試,該測試將在“類似於客戶的設置”中自動執行; 並確保您也有自動設置來運行此類測試。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.