错误:方法 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 方法,它必须是protectedpublic 【参考方案1】:

超类中的私有方法对子类不可见。您需要删除 @Override 注释或将 SimpleDate 中的方法更改为 protected 以消除编译错误。

移除@Override 不影响超类,两个isLeap 方法没有覆盖关系。

将SimpleDate中的方法改为protected,子类中的方法确实会覆盖超类中的方法。

【讨论】:

【参考方案2】:

我打算做的是测试一个“私有”方法,这当然是不可见的。由于它不可见,我无法覆盖它。所以我得到的错误是完全有道理的。

我通过使用 java.lang.reflect 解决了测试私有方法的问题 这个想法来自this paper。

现在,我在想的是如何为不提供类似 API 的其他语言解决同样的问题。换句话说,如果可能的话,如何创建一个模拟对象来进行测试,以规避方法的不可见性

【讨论】:

以上是关于错误:方法 X 必须覆盖或实现超类型方法的主要内容,如果未能解决你的问题,请参考以下文章

“类型 B 不能是 C 的超接口;超接口必须是接口”错误

覆盖 touchesBegan:错误 - 方法不会覆盖超类中的任何方法

Swift init 方法错误:声明 'init(coder:)' 不能覆盖多个超类声明

如何覆盖一个函数?

卡在 firebase_token.java

如果我们可以简单地覆盖超类的方法或使用抽象类,为啥还要使用接口? [复制]