【问题标题】:Error: method X must override or implement a supertype method错误:方法 X 必须覆盖或实现超类型方法
【发布时间】: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

标签: java eclipse junit5 anonymous-class


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-22
      • 2015-08-13
      • 1970-01-01
      • 2013-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多