Ошибка: метод X должен переопределять или реализовывать метод супертипа

#java #eclipse #junit5 #anonymous-class

Вопрос:

Я использую 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 (). (Строка ниже @переопределить)

Что ж, удивительно, но именно это я и сделал. Так что я не знаю, на что это жаловаться. Вот метод isLeap() в классе simpleDate:

 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.

Комментарии:

1. public boolean isLeap против private boolean isLeap

2. Вы не можете переопределить private метод, он должен быть protected или public

Ответ №1:

Частный метод в суперклассе не виден подклассу. Вам нужно либо удалить аннотацию @Override, либо изменить свой метод в SimpleDate на защищенный, чтобы устранить ошибку компиляции.

Удаление @Переопределения не влияет на суперкласс, два метода isLeap не имеют отношения переопределения.

Изменив метод в SimpleDate на защищенный, метод в подклассе действительно переопределит метод в суперклассе.

Ответ №2:

То, что я намеревался сделать, — это протестировать «частный» метод, который, конечно, не виден. Поскольку он не виден, я не могу его переопределить. Так что ошибка, которую я получил, имеет полный смысл.

Я решил проблему тестирования частного метода с помощью java.lang.отразите идею, взятую из этой статьи.

Теперь я думаю о том, как решить ту же проблему для других языков, которые не предоставляют аналогичный API. Другими словами, как создать макет объекта с целью тестирования, если это вообще возможно, чтобы обойти невидимость метода