如何为构造函数创建一个测试?

3

我正在为一个已经编译好的程序创建测试,但是我在努力实现100%的覆盖率时遇到了问题。

该类的构造函数如下:

public Contact(String name, String email){
     if (name == null){
           throw new IllegalAgrugmentException("name must not be null");
     }
}

我创建的测试内容如下:

public void testForContactConstructor(){
        Contact testContact = new Contact(null, null);
        assertThrows(IllegalArgumentException.class, () -> {
            testContact.getName();
        });
    }

测试没有被Eclipse覆盖。我该如何解决?


你需要创建两个不同的测试用例,一个名称为 null,另一个名称为 "someValidName"。 - Nakul Goyal
1个回答

2

你的断言似乎应该是这样的

assertThrows(IllegalArgumentException.class, () -> {
  contact = new Contact(null, null);
});

否则,在执行断言之前它将会抛出异常 :(

除此之外,我需要更多的信息,您使用的是什么测试框架?可能缺少注释。

总的来说,你可以像这样做(取决于构造函数的复杂程度):

public void TestContactConstructorFail(){
    assertThrows(IllegalArgumentException.class, () ->
      new Contact(null, null));
}

public void TestContactConstructorSuccess(){
    Contact c = new Contact(name,email);
    assertNotNull(c); //leave the rest for get/set test
}

如果您在构造函数中有复杂的验证或其他操作,建议将其委托给私有方法并单独测试这些方法。同时,也需要加上特定框架的注释,例如Junit的@Test


我正在使用Eclipse程序中的Java。通过您的编辑,我已经成功覆盖了assertThrows,但是未能覆盖Contact testContact = new Contact(null, null)。 - Havanna Ransom
那一定是因为 Lambda 在完成之前抛出了异常。通常,您只需要担心实际代码(非测试代码)的覆盖率有多少。因此,如果我们有一行测试代码没有被标记为已运行,可能存在冗余,但除此之外并不太重要。如果您想覆盖字段初始化等内容,还可以添加一个构造函数的正面测试(其中使用实际值而不是 null)。 :) - BjarkeBrodin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接