今天我看到了一个带有java断言而不是JUnit断言的JUnit测试用例 - 优先于其他断言是否有明显的优点或缺点?
答案 0 :(得分:85)
在JUnit4中,JUnit断言抛出的异常(实际上是Error)与java assert
关键字(AssertionError)抛出的错误相同,因此它与assertTrue
和其他的完全相同比堆栈跟踪你无法区分。
话虽如此,断言必须在JVM中使用特殊标志运行,导致许多测试似乎只是因为有人在JUnit测试运行时忘记使用该标志配置系统 - 不好。
一般来说,因为这个,我认为使用JUnit assertTrue
是更好的做法,因为它保证测试运行,确保一致性(你有时使用assertThat
或其他断言如果JUnit断言的行为在将来发生变化(例如挂钩到某种过滤器或其他未来的JUnit功能),那么你的代码将能够利用它。
java中assert关键字的真正目的是能够在没有运行时惩罚的情况下将其关闭。这不适用于单元测试。
答案 1 :(得分:25)
我更喜欢JUnit断言,因为它们提供比内置assert
语句更丰富的API,更重要的是,不需要明确启用,而不像assert
,这需要-ea
JVM参数。
答案 2 :(得分:14)
如果测试失败,您将获得更多信息。
assertEquals(1, 2);
会产生java.lang.AssertionError: expected:<1> but was:<2>
VS
assert(1 == 2);
会产生java.lang.AssertionError
如果将消息参数添加到assertEquals
答案 3 :(得分:6)
我会说在测试用例中使用JUnit断言,并在代码中使用java的断言。换句话说,真正的代码永远不会有JUnit依赖,很明显,如果它是一个测试,它应该使用它的JUnit变体,而不是断言。
答案 4 :(得分:0)
我想说如果你使用的是JUnit,你应该使用JUnit断言。 assertTrue()
基本上与assert
相同,否则为什么甚至使用JUnit?
答案 5 :(得分:0)
如果你专门使用闪亮和新的东西,这可能不适用,但断言直到1.4SE才引入Java。因此,如果您必须在具有较旧技术的环境中工作,则出于兼容性原因,您可能倾向于使用JUnit。