несколько тестовых классов для интерфейса, свернутого в пакет в junit 4? - PullRequest
1 голос
/ 08 апреля 2011

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

Это нормально, за исключением того, что у меня есть несколько разных классов (около 10 на данный момент), каждый из которых выполняет множество тестов на основе данных реального мира. Это означает, что для каждой конкретной реализации я заканчиваю тем, что пишу целые лоты тестовых классов, просто содержащих метод создания экземпляров.

Все это показалось мне немного беспорядочным, и мне было интересно, знает ли кто-нибудь о лучшем решении. Я думаю, что в идеале я хотел бы иметь возможность передать объект фабрики GraphSearcher в какой-то набор тестов и запустить все различные классы тестов. Это будет означать, что мне нужно будет написать лишь небольшой кусочек кода, чтобы новая реализация GraphSearcher работала со всеми тестами. Я просто не знаю, как это сделать с помощью junit 4. Я уверен, что должен быть какой-то довольно стандартный способ сделать это, но я пока не смог ничего найти. Любые указатели, которые есть у кого-либо, будут высоко оценены

Ответы [ 2 ]

2 голосов
/ 08 апреля 2011

Если я хорошо понимаю вашу проблему, у вас просто есть тестовый код, и вы хотели бы запускать его несколько раз, каждый раз с другой реализацией GraphSearcher, верно?Если это так, я бы, вероятно, пошел с Paremeterized JUnit Runner.Это может выглядеть следующим образом:

@RunWith(Parameterized.class)
public class GraphSearcherTest
{
    private GraphSearcher testedSearcher;

    public GraphSearcherTest(GraphSearcher searcher)
    {
        this.testedSearcher = searcher;
    }

    @Parameters
    public static Collection<Object[]> getParameters()
    {
        return Arrays.asList(new Object[][] {
                { new GraphSearcherImpl1() },
                { new GraphSearcherImpl2() }
        });
    }

    @Test
    public void testGraphSearcher()
    {
        // execute the test
        testedSearcher.search();

        // make some assertions
    }
}

Ключевые части:

  • аннотация @RunWith (Parameterized.class)
  • конструктор, который принимает проверенныйреализация GraphSearcher
  • аннотированного метода @ Parameters (с произвольным именем), который возвращает Collection.Этот метод будет вызываться для каждого элемента коллекции, и объект из коллекции будет добавлен в конструктор теста.
  • размер объекта [] в коллекции должен соответствовать числу аргументов конструктора

Таким образом, в этом случае тест будет вызван дважды.Первый тест получит экземпляр GraphSearcherImpl1, а второй экземпляр GraphSearcherImpl2 в своем конструкторе.

0 голосов
/ 08 апреля 2011

Вы можете использовать аннотацию @Parameters, чтобы предоставить вам различные реализации интерфейса.

Например: http://www.mkyong.com/unittest/junit-4-tutorial-6-parameterized-test/

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