错误:方法 X 必须覆盖或实现超类型方法
Posted
技术标签:
【中文标题】错误:方法 X 必须覆盖或实现超类型方法【英文标题】:Error: method X must override or implement a supertype method 【发布时间】:2021-11-26 07:02:28 【问题描述】:我正在使用 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:我正在使用eclipse。
【问题讨论】:
public boolean isLeap
vs private boolean isLeap
您不能覆盖private
方法,它必须是protected
或public
【参考方案1】:
超类中的私有方法对子类不可见。您需要删除 @Override 注释或将 SimpleDate 中的方法更改为 protected 以消除编译错误。
移除@Override 不影响超类,两个isLeap 方法没有覆盖关系。
将SimpleDate中的方法改为protected,子类中的方法确实会覆盖超类中的方法。
【讨论】:
【参考方案2】:我打算做的是测试一个“私有”方法,这当然是不可见的。由于它不可见,我无法覆盖它。所以我得到的错误是完全有道理的。
我通过使用 java.lang.reflect 解决了测试私有方法的问题 这个想法来自this paper。
现在,我在想的是如何为不提供类似 API 的其他语言解决同样的问题。换句话说,如果可能的话,如何创建一个模拟对象来进行测试,以规避方法的不可见性
【讨论】:
以上是关于错误:方法 X 必须覆盖或实现超类型方法的主要内容,如果未能解决你的问题,请参考以下文章
覆盖 touchesBegan:错误 - 方法不会覆盖超类中的任何方法