[英]Running JUnit tests with different data
我有一套单元测试。 我有一个在setup()方法中初始化的静态变量。 我想使用该静态变量的两个不同值来运行我的所有单元测试套件。
setup()中的静态变量被初始化为一个单例对象。 因此,我不能(我认为我不能)使用JUnit参数化测试。
我必须使用该静态变量的一个值运行所有测试,然后使用其他静态变量的值运行所有测试。
如果可能的话,有关如何以优雅的方式执行此操作的任何想法。
如果我的上面的描述不是很容易理解,则下面的代码
public class MyClassTest{
private static final Dep_class dep_obj;
public static void setup(){
dep_obj = Dep_class.getInstance("VALUE_1");
//You can have only instance of Dep_class at any time.
//So for second run I need to do a
//dep_obj = Dep_class.getInstance("VALUE_2") and run my tests.
}
public void test_mymethod(){
//do something with dep_obj
}
尝试这个
@RunWith(Parameterized.class)
public class MyClassTest {
private Object dep_obj;
public MyClassTest(String val) {
dep_obj = val;
}
@Parameters
public static Collection<?> data() {
Object[][] data = { { "val1" }, { "val2" }, { "val3" } };
return Arrays.asList(data);
}
@Test
public void test() {
System.out.println(dep_obj);
}
}
因此,首先,我会问为什么您有一个以这种方式初始化的单例。 似乎向.getInstance(String s)
方法中添加参数会增加歧义性和意外行为,因为在实例化之后该String参数只会被忽略(除非您在类型更改时重新实例化该参数)它在运行时非常不可预测)。
无论如何,一种简单的方法是将test_mymethod()抽象为父类,并具有两个子测试类,每个子类实例化单例的不同实例。 由于您的JVM不会重新启动,因此在运行任何测试之前,还需要PowerMock之类的东西才能将单例重置为预加载状态。
所以父类看起来像这样(添加了JUnit注释):
public abstract class MyAbstractTestClass {
private final Dep_class dep_obj;
@Before
public abstract void setup(){
// Begin by ensuring that the singleton instance is initialized to null -
// this is highly important, since subclasses will not be able to rely on
// an un-initialized state
Whitebox.setInternalState(dep_obj.getInstance(/*default, arbitrary, or null value*/, "instance", null);
// Now leave the actual singleton initialization to child classes
dep_obj = getSingleton();
}
public abstract Dep_class getSingleton();
@Test
public void test_mymethod(){
//do something with dep_obj
}
}
我对Powermock进行了一些假设-即您的单例正确检查实例是否为null,如果是,则将其初始化。 在这种情况下,我假设您实例的变量名称是“ instance”。 接下来,您的子类如下所示:
public class MyTestClass1 extends MyAbstractTestClass {
@Override
public void Dep_class getSingleton() {
return Dep_class.getInstance("VALUE_1");
}
}
public class MyTestClass2 extends MyAbstractTestClass {
@Override
public void Dep_class getSingleton() {
return Dep_class.getInstance("VALUE_2");
}
}
同样,我强烈建议您重新考虑以这种方式实现单例。 无论如何,都不应该使用单例-在可疑的设计模式之上的这样的实现是令人毛骨悚然的。 这个问题超出了一些良好的用法指导-确保您的单身人士符合此条件。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.