【问题标题】:How to test a constructor in a proper way for JUnit?如何以正确的方式为 JUnit 测试构造函数?
【发布时间】:2021-06-11 17:50:28
【问题描述】:

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

我在做的是,有一个类叫Person,它的构造函数有名字、身高和体重的变量。

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

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

例如,如果我写:

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

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

有什么正确的方法可以测试名称的字符是否超过20? 我应该在测试方法中写 if/else 条件吗?我应该如何在测试套件中展示 if 的边界?

谢谢!

【问题讨论】:

    标签: java unit-testing junit test-suite


    【解决方案1】:

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

    @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, "172", "62");
    }
    
    // I assume that null and empty names are not allowed either
    @Test(expected = IllegalArgumentException.class)
    public void personNameNullThrows() {
        new Person(null, "172", "62");
    }
    
    @Test(expected = IllegalArgumentException.class)
    public void personNameEmptyThrows() {
        person = new Person("", "172", "62");
    }
    
    @Test
    public void personNameBelow20Works() {
        person = new Person(NAME_10, "172", "62");
    }
    
    @Test
    public void personNameExactly20Works() {
        person = new Person(NAME_10, "172", "62");
    }
    

    【讨论】:

      【解决方案2】:

      有什么问题:

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

      【讨论】:

        猜你喜欢
        • 2013-09-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-10
        • 1970-01-01
        相关资源
        最近更新 更多