#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. Другими словами, как создать макет объекта с целью тестирования, если это вообще возможно, чтобы обойти невидимость метода