如何以正确的方式测试 JUnit 的构造函数?

问题描述

我目前正在为某些代码编写一个 Junit 测试套件。

我正在做的是,有一个名为 Person 的类,其中它的构造函数具有名称、高度和重量变量。

在其构造函数中,如果名称的字符数超过 20,则会引发异常。

如果测试需要测试构造函数不接受超过20个字符的名字,我该如何编写测试方法

例如,如果我写:

@Test (expected = IllegalArgumentException.class)
public void testPersoin() {
Person person = new Person("BobBobBobBobBobBobBobBobBobBobBobBobBobBobBobBobBobBob","172","62");
}

当我运行它时,它会通过测试用例,但它只是测试名称的长度: “BobBobBobBobBobBobBobBobBobBobBobBobBobBobBobBobBobBobBob”,但不能使用更长或更短的名称

有没有什么合适的方法可以测试names的字符是否大于20? 我应该在测试方法中编写 if/else 条件吗?我应该如何在测试套件中展示 if 的边界?

谢谢!

解决方法

我不确定您需要什么,但也许这就是您所追求的:

@Test (expected = IllegalArgumentException.class)
public void testPersoin() {
    // Extract the name
    String name = "BobBobBobBobBobBobBobBobBobBobBobBobBobBobBobBobBobBob";
    // Assert that it is over 20 characters long
    assertTrue(name.length() > 20);
    person = new Person(name,"172","62");
}

有时您可能还需要在测试前断言测试参数是有效的。但这不是最好的方法。最好只是让测试尽可能清晰,处理所有案例并正确命名案例,例如:

private static final String NAME_10 = "0123456789"; // below 20
private static final String NAME_20 = NAME_10 + NAME_10; // exactly 20
private static final String NAME_21 = NAME_20 + "x"; // over 20

private Person person;

@Test(expected = IllegalArgumentException.class)
public void personNameOver20Throws() {
    new Person(NAME_21,"62");
}

// I assume that null and empty names are not allowed either
@Test(expected = IllegalArgumentException.class)
public void personNameNullThrows() {
    new Person(null,"62");
}

@Test(expected = IllegalArgumentException.class)
public void personNameEmptyThrows() {
    person = new Person("","62");
}

@Test
public void personNameBelow20Works() {
    person = new Person(NAME_10,"62");
}

@Test
public void personNameExactly20Works() {
    person = new Person(NAME_10,"62");
}
,

有什么问题:

if(name==null || name.length()>20)
  throw new IllegalArgumentException();
...//rest of code in constructor