我对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块包装在引发异常的代码周围,然后fail()
在try块的末尾添加一条语句。像这样:
public void testNullParameter() {
try {
IPAddress addr = new IPAddress(null);
fail("InvalidIPAddressException not thrown.");
} catch(InvalidIPAddressException e) {
assertNotNull(e.getMessage());
}
}
这与您编写的内容没有太大不同,但:
assertTrue(addr.getOctets() == null);
没用。尽管如此,这还是有点丑陋。但这就是JUnit 4抢救的地方,因为异常测试是JUnit 4中最大的改进之一。有了JUnit 4,您现在可以像这样编写测试:
@Test (expected=InvalidIPAddressException.class)
public void testNullParameter() throws InvalidIPAddressException {
IPAddress addr = new IPAddress(null);
}
很好,不是吗?
现在,关于真正的问题,如果我不希望引发异常,我肯定会选择方法1(因为它不太冗长),并让JUnit处理该异常并按预期通过测试。
我正试图为一个方法编写一个测试用例,该方法基于特定的逻辑抛出异常。然而,测试用例失败了,因为预期的异常和获得的异常是不同的。 我如何解决这个问题?
我用Spock测试Java代码。我测试这段代码: 我写了一个测试: 它失败是因为抛出了另一个CustomException。但是在块中,我捕获这个异常并抛出一个,因此我希望我的方法将抛出,而不是。如何测试它?
我构建了一个有3个属性的帐户类:余额、所有者、acctNo。帐户类有2个构造函数,一个接受3个属性,一个不接受数据。帐户类有设置和获取方法以及存款和取款方法。 我还构建了一个类,该类从类扩展而来。将此类修改为类后,取款方法或此方法尝试将余额设置为零以下,将抛出。 JUnit测试人员修改测试方法,将尝试提取超过当前余额的可用,所以做测试方法。我需要修改JUnit测试透支帐户,以便它捕获异常,并捕获。
问题内容: 我有一个Java junit测试,该测试在开发机器上单独运行时可以通过。我们还有一个hudson作业,它可以在具有Java 1.5的Mac OS X 10.4节点上运行通过ant调用的所有测试。该测试直到最近才通过hudson版本,但是现在(没有相关的代码更改),每次测试都失败,并出现以下错误: 错误信息 分叉的Java VM异常退出。请注意,报告中的时间并不反映虚拟机退出之前的时间。
问题内容: 我真的是java的新手。 我正在构造函数上运行一些JUnit测试。构造函数是这样的:如果为其参数之一赋予null或空字符串,则应该抛出异常。 当我在JUnit中使用null或空字符串参数测试此构造函数时,即使我几乎100%确信将此类参数传递给它时,构造函数方法确实会引发异常,我也会看到一条红色的条。 如果该方法以预期的方式引发异常,则JUnit中是否应该没有绿色的条形?还是当异常抛出按
问题内容: 编辑:目前没有JUnit 4。 嗨,您好, 我对使用JUnit进行“智能”异常测试有疑问。目前,我这样做是这样的: 如您所见,对于每个应该引发异常的函数,我都需要一个try / catch块。似乎不是执行此操作的好方法-还是没有可能减少try / catch的使用? 问题答案: 我建议您需要分解为多个单独的测试。各个try / catch块似乎彼此非常独立。您可能还希望将通用初始化逻辑