Java 使用不同的数据运行JUnit测试
我有一套单元测试。我有一个静态变量,它在setup()方法中初始化。我想用该静态变量的两个不同值运行我的所有单元测试套件 setup()中的静态变量初始化为单例对象。所以,我不能(我想我不能)使用JUnit参数化测试 我必须使用该静态变量的一个值运行所有测试,然后使用该静态变量的其他值运行所有测试 如果可能的话,有没有关于如何以优雅的方式进行此操作的想法 下面的代码,如果我上面的描述不是很容易理解Java 使用不同的数据运行JUnit测试,java,testing,junit,Java,Testing,Junit,我有一套单元测试。我有一个静态变量,它在setup()方法中初始化。我想用该静态变量的两个不同值运行我的所有单元测试套件 setup()中的静态变量初始化为单例对象。所以,我不能(我想我不能)使用JUnit参数化测试 我必须使用该静态变量的一个值运行所有测试,然后使用该静态变量的其他值运行所有测试 如果可能的话,有没有关于如何以优雅的方式进行此操作的想法 下面的代码,如果我上面的描述不是很容易理解 public class MyClassTest{ private static fi
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
}
首先,我想问一下,为什么有一个以这种方式初始化的单例。似乎向
.getInstance(String s)
方法添加参数会增加歧义和意外行为,因为该字符串参数在实例化后将被忽略(除非您在类型更改时实例化它,在这种情况下,它在运行时将非常不可预测)
在任何情况下,一种简单的方法是将test_mymethod()抽象为父类,并有两个子测试类,每个子测试类实例化一个不同的单例实例。因为JVM不会重新启动,所以在运行任何测试之前,您还需要类似于PowerMock的东西来将singleton重置为预加载状态
因此父类看起来是这样的(添加了JUnit注释):
我对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");
}
}
再次,我强烈建议您重新考虑以这种方式实现单例。无论如何,单例应该很少使用——像这样在有问题的设计模式之上的实现是一个令人惊讶的问题。查看一些很好的使用指南-确保您的单例符合此标准。因此,首先,我想问一下为什么您有这样初始化的单例。似乎向
.getInstance(String s)
方法添加参数会增加歧义和意外行为,因为该字符串参数在实例化后将被忽略(除非您在类型更改时实例化它,在这种情况下,它在运行时将非常不可预测)
在任何情况下,一种简单的方法是将test_mymethod()抽象为父类,并有两个子测试类,每个子测试类实例化一个不同的单例实例。因为JVM不会重新启动,所以在运行任何测试之前,您还需要类似于PowerMock的东西来将singleton重置为预加载状态
因此父类看起来是这样的(添加了JUnit注释):
我对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");
}
}
再次,我强烈建议您重新考虑以这种方式实现单例。无论如何,单例应该很少使用——像这样在有问题的设计模式之上的实现是一个令人惊讶的问题。浏览一些好的使用指南-确保你的单身符合这些标准。试试这个
@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);
}
}
@RunWith(参数化的.class)
公共类MyClassTest{
私有对象dep_obj;
公共MyClassTest(字符串val){
dep_obj=val;
}
@参数
公共静态收集数据(){
对象[][]数据={{“val1”}、{“val2”}、{“val3”};
返回数组.asList(数据);
}
@试验
公开无效测试(){
系统输出打印LN(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);
}
}
@RunWith(参数化的.class)
公共类MyClassTest{
私有对象dep_obj;
公共MyClassTest(字符串val){
dep_obj=val;
}
@参数
公共静态收集数据(){
对象[][]数据={{“val1”}、{“val2”}、{“val3”};
返回数组.asList(数据);
}
@试验
公开无效测试(){
系统输出打印LN(dep_obj);
}
}