Java 如何在某些JUnit测试之前调用设置方法

Java 如何在某些JUnit测试之前调用设置方法,java,unit-testing,junit,gson,junit4,Java,Unit Testing,Junit,Gson,Junit4,我正在使用JUnit为操作JSON对象的方法创建单元测试。我想在我的测试文件中创建一个方法,该方法设置将在我的一些测试方法(但不是全部)中使用的对象。如何有选择地运行setup方法并将其结果JSONObject传输到测试方法?有更好的方法吗? 以下是我对设置方法(使用gson)的想法: 如何有选择地运行设置方法并将其传输 测试方法的最终目标 否您不能选择应应用在之前用@注释的方法的测试方法 有更好的方法吗 您可以在每次测试之前简单地调用此方法(您还可以将其设置为私有的,并使用实例方法来减少其访问

我正在使用JUnit为操作JSON对象的方法创建单元测试。我想在我的测试文件中创建一个方法,该方法设置将在我的一些测试方法(但不是全部)中使用的对象。如何有选择地运行setup方法并将其结果JSONObject传输到测试方法?有更好的方法吗? 以下是我对设置方法(使用gson)的想法:

如何有选择地运行设置方法并将其传输 测试方法的最终目标

否您不能选择应应用在之前用
@注释的方法的测试方法

有更好的方法吗

您可以在每次测试之前简单地调用此方法(您还可以将其设置为
私有的
,并使用实例方法来减少其访问:

private JsonObject prepareTestJson(){
    JsonObject testJson_container = new JsonObject();
    JsonObject testJson_inner = new JsonObject();
    String ContactInfo = "+1 111 111 1111";
    testJson_inner.addProperty("Contact", ContactInfo);
    testJson_container.add("ID", testJson_inner);
    return testJson_container;
}
例如:

@Test
public void foo(){
  JsonObject json = prepareTestJson();
  ...
}
另一种选择是将测试类分成两部分:一部分是需要
setup()
的测试,另一部分是不需要它的测试。
通过这种方式,您可以在
@之前使用init方法,或者简单地将这些语句放入类构造函数中。
例如:

private JsonObject testJson_container;

@Before
public void prepareTestJson(){
    testJson_container = new JsonObject();
    JsonObject testJson_inner = new JsonObject();
    String ContactInfo = "+1 111 111 1111";
    testJson_inner.addProperty("Contact", ContactInfo);
    testJson_container.add("ID", testJson_inner);       
}
但这种方式是人为的/技术上的分裂,它可能会降低测试代码的可读性。
所以我认为在大多数情况下,我会坚持第一种方式


此外,对于JUnit5,您有一个有趣的解决方法:使用
@MethodSource
,记录如下:

提供对方法返回的值的访问的ArgumentsSource 声明此批注的类的

这是为配合
@ParameterizedTest
而设计的,但它可能适合您的情况

你可以写:

import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.MethodSource;    

public class FooTest {

  @ParameterizedTest
  @MethodSource("prepareTestJson")
  void add(JsonObject testJson_container) {
    // do your logic
  }

  private static Arguments prepareTestJson() {
     JsonObject testJson_container = new JsonObject();
     JsonObject testJson_inner = new JsonObject();
     String ContactInfo = "+1 111 111 1111";
     testJson_inner.addProperty("Contact", ContactInfo);
     testJson_container.add("ID", testJson_inner);
     return Arguments.of(testJson_container);
  }
} 

你可以做一个不同的测试类。在你的情况下,这可能会更有逻辑性。你也可以只做一个非测试案例方法,每次都需要调用它。也许有一个JUnit方法,类似于C++,但是我不太熟悉它。为什么不简单地从测试中调用这个方法?可行性是将需要此准备的测试转移到一个单独的测试类中,在该类中,准备是在一个普通的
@Before
方法中完成的。(是的,每个测试单元有多个测试类是合法的…)我将把私有的prepareTestJson()放在哪里方法?当我将它包含在JUnit测试类
java.lang中时,我得到了这个错误。异常:没有找到匹配方法prepareTestJson()的测试
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.MethodSource;    

public class FooTest {

  @ParameterizedTest
  @MethodSource("prepareTestJson")
  void add(JsonObject testJson_container) {
    // do your logic
  }

  private static Arguments prepareTestJson() {
     JsonObject testJson_container = new JsonObject();
     JsonObject testJson_inner = new JsonObject();
     String ContactInfo = "+1 111 111 1111";
     testJson_inner.addProperty("Contact", ContactInfo);
     testJson_container.add("ID", testJson_inner);
     return Arguments.of(testJson_container);
  }
}