junit 分支条件测试Java(& C)

nbnkbykc  于 2022-11-11  发布在  Java
关注(0)|答案(1)|浏览(143)

我正在尝试对我的代码做一个分支和条件测试,这很简单。

package testing;
import java.util.*;

public class Exercise1 {

private String s;

public Exercise1(String s) {

    if (s == null || s.length() == 0)
        throw new IllegalArgumentException("s == null || s.lenght() == 0");

    this.s = s;
  }
}

在分支和cond测试中,我必须检查代码中的每一个条件,因此在我的例子中,我必须在字符串预期为空且size=0时进行测试。我在测试类中看到了这一点:

package testing
import static org.junit.*;
import org.junit.jupiter.api.Test;

class Exercise1Test{
    @Test(expected = IllegalArgumentException.class)
    public void stringNull() {
        new Exercise1(null);
    }    
}

但是java不能识别“expected”。我怎么才能检查字符串是否为空呢?

bbuxkriu

bbuxkriu1#

@Test(expected = ...)只能与JUnit 4一起使用。JUnit 5有Assertions.assertThrows作为替代。它允许您Assert不仅整个测试方法抛出异常,而且即使是其中的一小部分也抛出异常。这也已向后移植到JUnit 4.13。
您的测试方法将变成这样(使用Assertions.assertThrows的静态导入):

@Test
void stringNull() { // public not necessary in JUnit 5
    assertThrows(IllegalArgumentException.class, () -> new Exercise1(null));
}

但是它变得更好-assertThrows返回抛出的异常。它允许您在抛出异常后对异常执行Assert。它可以与JUnit 4的ExpectedException规则相比较。

@Test
void stringNull() {
    IllegalArgumentException thrown = assertThrows(IllegalArgumentException.class, () -> new Exercise1(null));
    assertEquals("s == null || s.lenght() == 0", thrown.getMessage());
}

关于使用assertThrows的警告:例如,对于下面的代码,你不知道是什么导致了IllegalArgumentException--对new Exercise的调用,还是对constructMessage的调用。

assertThrows(IllegalArgumentException.class, () -> new Exercise1(constructMessage()));

建议在调用assertThrows之前初始化这些参数:

String message = constructMessage();
assertThrows(IllegalArgumentException.class, () -> new Exercise1(message));

顺便说一句,您的导入混合了JUnit 4(org.junit.*)和JUnit 5(org.junit.jupiter.api)。只需删除JUnit 4的导入。

相关问题