@RunWith(value=Parameterized.class)
public class FilterTests {
@Parameters
public static Collection<PluginInfo[]> getPlugins() {
List<PluginInfo> possibleClasses=PluginManager.getPluginsNamed("Filter");
return wrapCollection(possibleClasses);
}
final protected PluginInfo pluginId;
final IOPlugin CFilter;
public FilterTests(final PluginInfo pluginToUse) {
System.out.println("Using Plugin:"+pluginToUse);
pluginId=pluginToUse; // save plugin settings
CFilter=PluginManager.getPluginIO(pluginId); // create an instance using the factory
}
//.... the tests to run
6 回答
扩展第一个答案,JUnit4的参数方面非常有效 . 这是我在项目测试过滤器中使用的实际代码 . 该类使用工厂函数(
getPluginIO
)创建,函数getPluginsNamed
使用SezPoz和注释获取名称的所有PluginInfo类,以允许自动检测新类 .注意,重要的是(我个人不知道它为什么会这样工作)将集合作为提供给构造函数的实际参数的数组的集合,在本例中是一个名为PluginInfo的类 . wrapCollection静态函数执行此任务 .
使用JUnit 4.0,您可以使用parameterized tests:
将
@RunWith(value = Parameterized.class)
注释添加到测试夹具中创建
public static
方法,返回Collection
,用@Parameters
注释,并将SinglyLinkedList.class
,DoublyLinkedList.class
,CircularList.class
等放入该集合中将测试夹具的构造函数添加到
Class
:public MyListTest(Class cl)
,并将Class
存储在实例变量listClass
中在
setUp
方法或@Before
中,使用List testList = (List)listClass.newInstance();
通过上述设置,参数化运行器将为您在
@Parameters
方法中提供的每个子类创建测试夹具MyListTest
的新实例,从而允许您为需要测试的每个子类执行相同的测试逻辑 .基于@dasblinkenlight和this anwser的anwser,我想出了一个我想要分享的用例的实现 .
我将ServiceProviderPattern(difference API and SPI)用于实现接口
IImporterService
的类 . 如果开发了新的接口实现,则只需更改 META-INF/services/ 中的配置文件即可注册实现 .META-INF/services/ 中的文件以服务接口的完全限定类名(
IImporterService
)命名,例如:此文件包含实现
IImporterService
的casses列表,例如工厂类
ImporterFactory
为客户端提供接口的具体实现 .ImporterFactory
返回通过ServiceProviderPattern注册的接口的所有实现的列表 .setUp()
方法确保为每个测试用例使用新实例 .ImporterFactory.INSTANCE.getImplementations()
方法如下所示:实际上,您可以在测试类中创建一个帮助器方法,将测试
List
设置为依赖于参数的某个实现的实例 . 与this结合使用,您应该能够获得所需的行为 .我'd probably avoid JUnit'的参数化测试(IMHO非常笨拙地实现),只是创建一个抽象的
List
测试类,它可以被测试实现继承:然后,不同的实现获得自己的具体类:
这样做的好处(而不是制作一个测试所有实现的测试类)是,如果有一些特定的极端情况,你想用一个实现测试,你可以添加更多的测试到特定的测试子类 .
我知道这是旧的,但是我学会了以稍微不同的变化做到这一点,这很好地工作,你可以将
@Parameter
应用于字段成员来注入值 .在我看来,这只是一点清洁 .