我想做一个分支& &;对我的代码进行条件测试,这很简单。
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的去掉。