gpt4 book ai didi

java - JUnit 测试抛出异常的错误形式?

转载 作者:IT老高 更新时间:2023-10-28 20:24:18 26 4
gpt4 key购买 nike

我对 JUnit 还是很陌生,我真的不知道异常和异常处理的最佳实践是什么。

例如,假设我正在为 IPAddress 类编写测试。它有一个构造函数 IPAddress(String addr),如果 addr 为 null,它将抛出 InvalidIPAddressException。据我通过谷歌搜索得知,null 参数的测试将如下所示。

@Test
public void testNullParameter()
{
try
{
IPAddress addr = new IPAddress(null);
assertTrue(addr.getOctets() == null);
}
catch(InvalidIPAddressException e)
{
return;
}

fail("InvalidIPAddressException not thrown.");
}

在这种情况下,try/catch 是有意义的,因为我知道异常即将到来。

但是现在如果我想编写 testValidIPAddress(),有几种方法可以做到:

方式#1:

@Test
public void testValidIPAddress() throws InvalidIPAddressException
{
IPAddress addr = new IPAddress("127.0.0.1");
byte[] octets = addr.getOctets();

assertTrue(octets[0] == 127);
assertTrue(octets[1] == 0);
assertTrue(octets[2] == 0);
assertTrue(octets[3] == 1);
}

方式#2:

@Test
public void testValidIPAddress()
{
try
{
IPAddress addr = new IPAddress("127.0.0.1");
byte[] octets = addr.getOctets();

assertTrue(octets[0] == 127);
assertTrue(octets[1] == 0);
assertTrue(octets[2] == 0);
assertTrue(octets[3] == 1);
}
catch (InvalidIPAddressException e)
{
fail("InvalidIPAddressException: " + e.getMessage());
}
}

标准做法是向 JUnit 抛出意外异常还是自己处理?

感谢您的帮助。

最佳答案

其实,旧式的异常测试是在抛出异常的代码周围包裹一个try block ,然后在末尾添加一个fail()语句尝试 block 。像这样的:

public void testNullParameter() {
try {
IPAddress addr = new IPAddress(null);
fail("InvalidIPAddressException not thrown.");
} catch(InvalidIPAddressException e) {
assertNotNull(e.getMessage());
}
}

这和你写的没什么不同,但是:

  1. 你的 assertTrue(addr.getOc​​tets() == null); 没用。
  2. IMO 的意图和语法更清晰,因此更易于阅读。

不过,这有点难看。但这就是 JUnit 4 的用武之地,因为异常测试是 JUnit 4 中最大的改进之一。使用 JUnit 4,您现在可以像这样编写测试:

@Test (expected=InvalidIPAddressException.class) 
public void testNullParameter() throws InvalidIPAddressException {
IPAddress addr = new IPAddress(null);
}

很好,不是吗?

现在,关于真正的问题,如果我不希望抛出异常,我肯定会选择方法#1(因为它不那么冗长)并让 JUnit 处理异常并按预期使测试失败。

关于java - JUnit 测试抛出异常的错误形式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1836364/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com