Как ввести параметр в конструктор класса TestNG? - PullRequest
2 голосов
/ 01 августа 2011

Я реализовал программу с шаблоном стратегии. Поэтому у меня есть интерфейс, который используется в некоторых местах, и конкретная реализация может быть заменена.

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

Мой тестовый класс выглядит примерно так:

public class MyTestClass {

    private StrategeyInterface strategy;

    public MyTestClass(StrategeyInterface strategy) {
        this.strategy = strategy;
    }
    ....test methods using the strategy.
}

Параметризованный конструктор должен использоваться для внедрения конкретной стратегии в начале испытаний.

Теперь я не получил TestNG, чтобы запустить его и внедрить конкретный экземпляр реализации. Я пробовал несколько способов с наследованием, @DataProvider, @Factory и соответствующих методов, но без удачи.

Вот что говорится в отчете testNG:

Can't invoke public void MyClass.myTestMethod(): either make it static or add a no-args constructor to your class

Я использую плагин maven surefire для запуска тестов. Вот соответствующая часть pom.xml:

    <build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <configuration>
                <suiteXmlFiles>
                    <suiteXmlFile>src/test/resources/testng.xml</suiteXmlFile>
                </suiteXmlFiles>
            </configuration>
        </plugin>
    </plugins>
</build>

Как мне написать и запустить тесты, добавив конкретную реализацию в класс теста?

Заранее спасибо.

P.S. Я мог бы доставить больше кода, который я пытался. Я еще не опубликовал это здесь, потому что я пробовал так много вариантов, что я сейчас немного растерялся, и все они провалились.

1 Ответ

4 голосов
/ 01 августа 2011

У вас есть несколько вариантов. Если вы используете Guice, - это очень простой способ внедрить вашу реализацию .

Если нет, вы можете использовать комбинацию фабрик и поставщика данных:

@Factory(dataProvider = "dp")
public FactoryDataProviderSampleTest(StrategyInterface si) {
}

@DataProvider
static public Object[][] dp() {
  return new Object[][] {
    new Object[] { new Strategy1Impl() },
    new Object[] { new Strategy2Impl() },
  };
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...