Объект класса <Test>не совпадает с типом объекта Test?Junit - PullRequest
1 голос
/ 24 июня 2011

Я пытаюсь написать некоторый код, который рекурсивно добавляет TestSuites в проект к набору пакетов, расположенных в корне иерархии пакетов.

Я уже написал код, который возвращает объект Collection, который содержит объект File для каждого Test Suite, найденного в моем проекте.

Я сейчас пытаюсь пройтись по ним и добавить их в TestSuite в файле с именем AllTests.java:

.
public static Test suite() throws IOException, ClassNotFoundException {
    TestSuite suite = new TestSuite();

            //Code not included for getTestSuites() in this snippet.
    Collection<File> testSuites = getTestSuites();
    for(File f: testSuites) {

            //Truncate the path of the test to the beginning of the package name
            String testName = f.getAbsolutePath().substring(f.getAbsolutePath().lastIndexOf("net"));

            //Replace backslashes with fullstops
            testName = testName.replaceAll("\\\\", ".");

            //Take the .class reference off the end of the path to the class
            testName = testName.replaceAll(".class", "");

            //Add TestSuite to Suite of Suites

            Class<? extends Test> test = (Class<? extends Test>) AllTests.class.getClassLoader().loadClass(testName);
            suite.addTest(test);
    }

К сожалению, я получаю следующую ошибку компилятора в строке suite.addTest (test):

Метод addTest (Test) в виде TestSuite не применяется для аргументы (класс )

Допускаю ли я фундаментальную ошибку, предполагая, что ссылка Class и ссылка Test - одно и то же?

Ответы [ 4 ]

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

Да, вы делаете фундаментальную ошибку, предполагая, что ссылка Class и ссылка Test - одно и то же.

Вам необходим экземпляр класса, который расширяет Test, а не экземпляр объекта Class, определение которого расширяется Test (классы тоже являются объектами в Java).

1 голос
/ 24 июня 2011

Class<Test> описывает концепцию класса Test - его поля, методы и другие вещи, описанные кодом Java при определении класса Test. Существует , как правило, (чтобы исключить загрузчиков классов из этого обсуждения) один экземпляр Class<Test> во всей JVM, поскольку в основном существует только один Test класс.

То же самое относится к каждому Test подклассу - обычно есть один экземпляр Class<TestSubClass> для каждого TestSubClass.

С другой стороны, может быть любое количество Test объектов.

Java позволяет вам создавать Test объекты из Class<Test>, вызывая newInstance против вашего Class<Test> экземпляра. В общем, измените свою строку с:

suite.addTest(test);

до

suite.addTest(test.newInstance());

И обработать все потенциальные исключения.

1 голос
/ 24 июня 2011

TestSuite.addTest нужен экземпляр класса Test; не просто объект класса.

Вы можете попробовать использовать Class.newInstance(), если ваши тесты можно (они должны) создавать без параметров.

-

Возможно, лучшая стратегия - начать использовать Maven; который автоматически запускает все тестовые классы в исходной папке src / test / java. Но это может быть довольно большой ремонт :)).

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

Используемый метод ожидает экземпляр класса Test (sub).Вероятно, вы ищете addTestSuite (Class testClass), который позволяет добавлять классы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...