Могут ли подклассы изменять поведение статических методов в абстрактном суперклассе в Java? - PullRequest
1 голос
/ 23 июня 2011

Я использую бегунок «Параметризованный» для выполнения некоторых тестов.Я генерирую тестовые данные из файла XML.Это отлично работает.

Теперь я хочу применить это поведение к нескольким классам тестов без необходимости реплицировать код генерации тестовых данных.Поэтому я создал абстрактный класс, который выполняет работу по заполнению тестовых данных из «XML-файла».Если бы подклассы могли сказать, какой XML-файл использовать, я бы достиг своей цели.

Но я не смог найти способ сделать это.

Это мой супер-class

@RunWith(Parameterized.class)
public abstract class AbstractXMLDrivenTest{
     @@Parameters
     public static Collection<Object[]> generateData () {
         /* Reads an XML File and returns test input data */
     }
}

Вот подкласс

public class TestSomeThing extends AbstractXMLDrivenTest {
     public TestSomeThing(args) {
     /* Args are populated by generateData in superclass */
     }
}

Это прекрасно работает, если я использую XML-файл, предназначенный для TestSomething в AbstractXMLDrivenTest.Я хочу, чтобы XML-файл определялся подклассом, т.е. TestSomething, чтобы я мог использовать суперкласс с другими тестовыми примерами.Надеюсь, теперь все ясно.

Ответы [ 5 ]

2 голосов
/ 23 июня 2011

В Java нет наследования для статических методов. Кроме того, для статического метода не имеет значения, является ли его класс абстрактным или нет - класс имеет только функцию области видимости для статических методов.

Чтобы использовать наследование, используйте нестатические методы. Таким образом, вы сможете извлечь имя файла XML из нестатического метода или нестатического поля подкласса.

0 голосов
/ 23 июня 2011

Если ваше имя файла xml хранится как статический член вашего суперкласса, пусть ваш подкласс назначит значение до вызова generateTestData.

0 голосов
/ 23 июня 2011

Достаточно одного подкласса. Вместо того, чтобы умножать подклассы тестирования, просто вызовите свой метод тестирования для разных файлов теста. На самом деле, вам лучше даже не делать свой класс тестирования подклассом, а просто отдельным классом.

Если вы хотите использовать стандартное для отрасли тестирование, посмотрите на JUnit.

EDIT:
Вы не читали документ внимательно. Вам не нужны подклассы вообще: вы строите свои различные тесты в виде массива generateData. В вашем случае у вас будет массив пар вида {("test1.xml", objectResult1), ("test2.xml", objectResult2),...}. Конструктор тестового класса имеет вид ParametrizedTest(String fileXML, ObjectResult result).

0 голосов
/ 23 июня 2011

Статические методы не могут быть переопределены в Java - независимо от того, является ли класс абстрактным или нет.

0 голосов
/ 23 июня 2011

Нет, подклассы не могут переопределять статические методы.

http://www.coderanch.com/how-to/java/OverridingVsHiding

...