在代码中不仅在测试中使用断言

时间:2018-12-15 01:29:16

标签: junit assertion

我知道,在测试中使用断言来检查程序员的前置条件和后置条件是否为真,以及断言是否失败,是否有需要调试和修复的错误。

断言是一种软件结构,开发人员在其中声明(“断言”)他认为永远都是真实的条件。如果条件在某些语言中为假,则抛出异常,在其他语言中,会打印一条消息,而在其他语言中,程序将停止运行。

上面定义中突出显示的“已打印消息”引起了我的注意。

我的问题是,我们可以在实际代码本身中扩展使用assert语句,并捕获AssertionErrors来记录消息,而不仅仅是测试吗? 基本上是为了避免过多使用if-else语句(我个人讨厌if-else btw)。 例如,以下所有

String response = aMethod(sendSomething);
if (response!=null && response!="") {
  //blah blah
} else { 
  log.error("Response is null");
  throw new NoDataFoundException();
}

可以用下面提供的更详细的消息代替。

try{
   assertThat(aMethod(sendSomething), notNullValue());
} catch (AssertionError e) {
   log.error(e.getMessage());
}

1 个答案:

答案 0 :(得分:0)

您不想捕获断言失败(*)。根据定义,该程序在其设计范围之外运行。唯一安全的方法是出去。

(*)好吧,如果捕获它的目的是记录所需的一切以诊断问题,然后迅速排除故障,则可以捕获它。

在您的示例中,看来在测试响应并记录故障之后,您将继续进行内联。总的来说,这是一个坏主意,但这也许只是您的快速说明,不应从字面上看。

关于我要作为您的总体观点:是的,如果您要检查所有前提条件或后置条件,请将检查保留在运输代码中。

我的代码如下:

  response = aMethod(sendSomething);
  if (response == null || response.isEmpty())
     throw new InternalError("....");

并且在某些最外层会捕获错误,异常处理的要点是您可以将控制权转移到更远的地方,而不必在发生时立即处理所有事情-特别是如果“它不能发生”。