2012-08-29 36 views
1

我们有一些Java代码,我们会非常愿意通过三种方式运行:Java的断言无一例外

  1. 抛出一个异常,当一个assert失败
  2. 打印堆栈跟踪,但在其他方面继续当assert失败
  3. 忽略一个assert

这是在三个不同的环境(开发,测试,生产,分别地)中运行。我们可以通过使用-ea JVM选项在第一个和最后一个之间切换,但是可以执行第二个?

谢谢。

编辑:我们已经声明无处不在。我们希望在运行时更改此选项而不更改我们的代码。

+0

为什么要在测试环境中使用#2?断言代表应始终通过的语句,如果不是,那就是一个错误。 (坦率地说,我更喜欢开发,测试和生产中的第一名。) –

+0

我们不希望在生产中使用'assert',以防万一我们遗漏了某些东西。我们不希望'assert'使我们的测试环境崩溃,例如测试版网站。我们想知道这些错误,而不会让测试停下来。 – Jayen

回答

0

您不能,不能使用AssertAssert是专门为失败而设计的,不容忽视。

+0

我认为你对java关键字'assert'与JUnit'Assert'类 –

+0

混淆,这可能对'assert'也是如此,但是我希望有人知道一些JVM标志我不要测试 – Jayen

4

它几乎好像你想使用单元测试,而不是Java的内置assert。看看JUnit能为你和你的团队做些什么。

您可以设置测试运行,他们会通知您失败。如果你想要一个堆栈跟踪,你可以通过提升/捕获一个异常来创建你自己的,然后使用e.printStackTrace()

+1

testcases不测试与断言相同的东西。测试是为了功能。断言是为了“这永远不会发生,如果是这样,我不能保证我会做我应该做的。”你应该无法创建一个测试用例来触发断言,如果可以的话,那么你应该处理该测试,而不是使用assert。 – Jayen

+0

你可以同时做两件事 - 你可以测试功能(例如,这个方法叫做?这个数据是否保存在DAO中?),并且当你完成之后断言对象的状态必须是真的(给定这些条件,这些字段是否包含这些数据?)。一个程序应该永远不会*(在我的脑海中)隐含地举起手来吓倒。如果你遇到过这样的情况,那么关于可以被断言的对象或环境必须有*真实的东西。 – Makoto

+0

我不明白。代码已经在开发环境中通过了所有设计的测试,测试环境在进入生产之前需要额外测试。在测试和生产过程中,我们不希望它抛出手中的恐慌,但我们确实希望它在开发中。 – Jayen

0

因为assert会抛出AssertionError,所以您可以非常轻松地实现#2。

try { 
    assert false; 
} catch (final AssertionError error) { 
    error.printStackTrace(); 
} 
System.out.println("survived!"); 
+0

这是如何让我们在#1,#2和#3之间切换?这只能让我们做#2和#3,而不是#1。 – Jayen

+0

@Jayen使用一个标志来决定是否使用'try'-'catch'中的一个,而不是一个。 – oldrinb

+0

就像一个由参数解析器设置的全局变量?这似乎很hacky。更不用说改变我们在代码中已经拥有的每一个断言。 – Jayen