Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Объект Class‹Test› не того же типа, что и тестовый объект? Юнит

Автор вопроса: 8bitjunkieОтветов: 4

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

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

Теперь я пытаюсь просмотреть их и добавить в 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 неприменим для аргументов (Класс ‹ Capture#3-of ? extends Test>)

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

javaunit-testingjunit

Ответы

Ответ 1 · рейтинг 2 · Bohemian♦

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

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

Ответ 2 · рейтинг 1 · Yhn

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

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

--

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

Ответ 3 · рейтинг 1 · Nick

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

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

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

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

suite.addTest(test);

to

suite.addTest(test.newInstance());

И обрабатывать все возможные исключения.

Ответ 4 · aliher

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы