如何为不同的 JUnit 测试集设置多个设置?

How to have multiple setups for different sets of JUnit Tests?

最近刚开始学习JUnit,遇到了以下问题。

看看下面的class

class MyClass {
  String a;

  public MyClass(String a) {
    this.a=a;

  String doSomething(String a) {
    if( a.isEmpty() )
      return "isEmpty";
    else
      return"isNotEmpty";
}

我想针对这两种情况测试上述方法。如果我继续编写测试用例的一般结构,它将看起来像这样:

class MyClassTest {

  MyClass myClass;

  @BeforeEach
  void setUp() {
    myClass=new MyClass("sampleString");
  }

  @Test
  void doSomethingTest() {
    Assertions.equal("isNotEmpty", myClass.doSomething());
  }
}

但是,为了测试空字符串条件,我需要另一种设置方法,而不是 "sampleString" 我传递一个空字符串。

以下是我能想到的方法以及每个方法的问题:

出于说明目的,此示例已保持简单。

您始终可以在测试方法中准备非公共数据。与使用参数化测试相比,我一直认为这种方式更容易。您不能在 1 个文件中混合参数化和非参数化测试。

@Test
void doSomething_nullString()
{
    myClass = new MyClass(null);
    Assert.assertNull(myClass.doSomething());
}

@Test
void doSomething_emptyString()
{
    myClass = new MyClass("");
    Assert.assertEquals("", myClass.doSomething());
}

@Test
void doSomething_nonEmptyString()
{
    myClass = new MyClass("sampleString");
    Assert.assertEquals("sampleString", myClass.doSomething());
}

或者,您始终可以在测试中使用辅助方法 class。

private MyClass createTestObject_nonNullString() {
    return new MyClass("nonNullString");
}

private MyClass createTestObject_nullString() {
    return new MyClass(null);
}

@Test
public void doSomething_sample() {

    MyClass test = createTestObject_nonNullString();
    // perform test
}

将具有相同设置的测试分组在内部 class 中,并用 @Nested 注释。每个嵌套测试 class 都可以在本地 @BeforeEach 方法中有自己的设置。