我正在使用 JUnit 5,并從“軟體測驗”一書中復制了代碼,以便創建一個模擬物件進行測驗。部分測驗代碼是:
@Test
public void rangesOKTestWithoutDependency() {
// This is an anonymous class
SimpleDate simpleDate = new SimpleDate(1, 1, 2000) {
@Override
public boolean isLeap(int year) {
if(2000 == year) return true;
else if(2001 == year) return false;
else throw new IllegalArgumentException("No Mock for year " year);
}
};
assertTrue(simpleDate.rangesOK(2, 29, 2000)); // Valid due to leap year
assertFalse(simpleDate.rangesOK(2, 29, 2001)); // Valid due to leap year
}
我有一個編譯器錯誤,它說“方法 isLeap(int) 必須覆寫或實作超型別方法”。在我覆寫 isLeap() 方法的行中報告了此錯誤。(@override 下面的行)
好吧,令人驚訝的是,這就是我所做的。所以我不知道這是在抱怨什么。這是 simpleDate 類中的 isLeap() 方法:
private boolean isLeap(int year) {
boolean isLeapYear = true;
if(year % 4 != 0)
isLeapYear = false;
else if(year % 100 != 0)
isLeapYear = true;
else if(year % 400 != 0)
isLeapYear = false;
return isLeapYear;
}
如您所見,測驗器中的方法是原始方法的重寫版本,但仍然出現錯誤。有什么想法嗎?
ps:我正在使用日食。
uj5u.com熱心網友回復:
超類中的私有方法對子類不可見。您需要洗掉 @Override 注釋或將 SimpleDate 中的方法更改為 protected 以洗掉編譯錯誤。
去掉@Override 不會影響超類,兩個 isLeap 方法沒有覆寫關系。
將 SimpleDate 中的方法更改為 protected,子類中的方法確實會覆寫超類中的方法。
uj5u.com熱心網友回復:
我打算做的是測驗一個“私有”方法,這當然是不可見的。由于它不可見,我無法覆寫它。所以我得到的錯誤是完全有道理的。
我通過使用 java.lang.reflect 解決了測驗私有方法的問題,想法來自于這篇論文。
現在,我在想的是如何為不提供類似 API 的其他語言解決相同的問題。換句話說,如果可能的話,如何創建一個模擬物件以進行測驗,以規避方法的不可見性
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/324400.html
