【发布时间】:2015-04-07 10:43:58
【问题描述】:
假设你有一个这样的公共方法
public Sprite spriteAt(int x, int y)
{
assert withinBorders(x, y) : "PRE: x and y should be inside the borders";
return tileAt(x, y).topSprite();
}
对比
public Sprite spriteAt(int x, int y)
{
if (!withinBorders(x, y)) throw new InvalidArgumentException();
return tileAt(x, y).topSprite();
}
在最底层的情况下,我通常会有一个单元测试用例来检查当给定 x 和/或 y 的无效值时是否引发异常,如下所示:
@Test(expected = InvalidArgumentException.class)
public void SpriteAt_InvalidX_ThrowsInvalidArgumentException()
{
sut.spriteAt(-100, 0);
}
这个测试用例是为了确保方法中实现了参数验证逻辑。
但是,对于顶部的断言方法,我不确定我应该做什么。断言不是生产代码,我认为这意味着我不必测试断言。
另一方面,我认为当方法中的逻辑发生变化时,单元测试应该通过失败来通知开发人员。如果我不编写测试用例来检查是否存在检查无效参数的断言(就像我对异常方法所做的那样),那么当我不小心删除了断言行代码时,我可能没有意识到我犯了一个错误。
因此,如果在启用断言的情况下运行 junit 并且在未启用断言时不做任何事情,我想做的是检查断言是否到位。下面的代码将包含伪代码。
@Test
public void SpriteAt_InvalidX_AssertionThrowsException()
{
if (assertion is enabled)
{
try
{
sut.spriteAt(-100, 0);
fail();
}
catch (AssertionFailureException e)
{
}
}
}
回到我的观点。我想知道单元测试是否应该测试断言。如果是这样,我是否朝着正确的方向前进?如果没有,如何防止在没有单元测试的情况下意外删除断言代码?
【问题讨论】:
标签: java unit-testing exception junit assertions