Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用不同的数据运行JUnit测试_Java_Testing_Junit - Fatal编程技术网

Java 使用不同的数据运行JUnit测试

Java 使用不同的数据运行JUnit测试,java,testing,junit,Java,Testing,Junit,我有一套单元测试。我有一个静态变量,它在setup()方法中初始化。我想用该静态变量的两个不同值运行我的所有单元测试套件 setup()中的静态变量初始化为单例对象。所以,我不能(我想我不能)使用JUnit参数化测试 我必须使用该静态变量的一个值运行所有测试,然后使用该静态变量的其他值运行所有测试 如果可能的话,有没有关于如何以优雅的方式进行此操作的想法 下面的代码,如果我上面的描述不是很容易理解 public class MyClassTest{ private static fi

我有一套单元测试。我有一个静态变量,它在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
      }

首先,我想问一下,为什么有一个以这种方式初始化的单例。似乎向
.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);
}
}