我已经使用策略模式实现了一个程序。所以我有一个在某些地方使用的接口,可以替换具体的实现。
现在我要测试这个程序。我想以类似的方式做到这一点。编写一次测试,测试接口。应在测试开始时注入具体的接口实现,以便我可以轻松替换它。
我的测试类与此类似:
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。我可以提供更多我尝试过的代码。我没有在这里发布它,但是,因为我尝试了很多变种,所以我现在有点困惑,所有这些都失败了。
答案 0 :(得分:4)
您有几种选择。如果您使用的是Guice,here is a very straightforward way to inject your implementation。
如果没有,您可以混合使用工厂和数据提供者:
@Factory(dataProvider = "dp")
public FactoryDataProviderSampleTest(StrategyInterface si) {
}
@DataProvider
static public Object[][] dp() {
return new Object[][] {
new Object[] { new Strategy1Impl() },
new Object[] { new Strategy2Impl() },
};
}