如何为不同的 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"
我传递一个空字符串。
以下是我能想到的方法以及每个方法的问题:
- 根本不使用 setUp,而是在单独的测试方法中初始化 class。但是,如果假设有 10 个测试用例;其中 5 个需要空字符串和其余
"sampleString"
那么这没有意义。同样,我们可以为这个重复代码使用一个单独的方法,并在每个测试用例中单独调用它,但这违背了使用 steup 方法的目的。假设我想使用两种不同的设置方法,有办法吗?
- 进行参数化设置。我不知道这是否可能。如果是,请为此分享一些有用的链接。
- 使用测试工厂。我尝试阅读有关此内容的内容,但找不到针对此特定案例的示例。如果你有的话,请分享。
出于说明目的,此示例已保持简单。
您始终可以在测试方法中准备非公共数据。与使用参数化测试相比,我一直认为这种方式更容易。您不能在 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
方法中有自己的设置。
最近刚开始学习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"
我传递一个空字符串。
以下是我能想到的方法以及每个方法的问题:
- 根本不使用 setUp,而是在单独的测试方法中初始化 class。但是,如果假设有 10 个测试用例;其中 5 个需要空字符串和其余
"sampleString"
那么这没有意义。同样,我们可以为这个重复代码使用一个单独的方法,并在每个测试用例中单独调用它,但这违背了使用 steup 方法的目的。假设我想使用两种不同的设置方法,有办法吗? - 进行参数化设置。我不知道这是否可能。如果是,请为此分享一些有用的链接。
- 使用测试工厂。我尝试阅读有关此内容的内容,但找不到针对此特定案例的示例。如果你有的话,请分享。
出于说明目的,此示例已保持简单。
您始终可以在测试方法中准备非公共数据。与使用参数化测试相比,我一直认为这种方式更容易。您不能在 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
方法中有自己的设置。