分支和条件测试 Java



我想做一个分支& &;对我的代码进行条件测试,这很简单。

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;
}
}

在分支和二次测试中,我必须检查代码中的每一个条件,因此,例如在我的情况下,我必须在字符串预计为null且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&;。我如何检查字符串是否为空?

@Test(expected = ...)只能与JUnit 4一起使用。JUnit 5使用Assertions.assertThrows作为替代品。它允许您断言不仅整个测试方法会抛出异常,甚至其中的一小部分也会抛出异常。这也被反向移植到JUnit 4.13。

您的测试方法将变成这样(使用Assertions.assertThrows的静态导入):

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

但是它变得更好-assertThrows返回被抛出的异常。它允许您在抛出异常之后对异常执行断言。它可以与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的去掉。

相关内容

  • 没有找到相关文章

最新更新