JUnit 测试可以从返回断言的对象解析吗?
例如,如果我有一个如下所示的测试,这会起作用吗?
@Test
public void testCase1() {
TestObject to = new TestObject();
to.login();
to.runTest();
// then assert success
to.verifyTest();
}
public Class TestObject() {
....
public Assert verifyTest() {
return assertTrue("Test result not found.", this.validateTestResult() );
}
}
最佳答案
大多数 Assert 调用如果失败,都会抛出 AssertionError
,因此代码看起来不会完全像您所说的那样,但您的代码可以稍微调整并编译/运行。因为它们是作为异常实现的,所以您可以从任何地方调用 Assert 方法,包括您为帮助更轻松地运行测试而设置的任何辅助类,无论您希望在堆栈中的深度如何。
编辑:如果您需要针对许多对象进行一组类似的断言,我非常建议您设置辅助类。我误解了并认为您的 TestObject
是您的被测系统;其余部分适用于这种情况。
==
没有什么可以阻止您从被测类中调用 Assert
方法,但 JUnit 的部分目的是拥有与代码类分离的干净测试类。这样,测试就可以单独发展,并且通常甚至不需要更改,除非类的接口(interface)发生更改。在我的代码中,我将它们放在单独的“源文件夹”中的同一个包中,因此您拥有:
- src/com/mypackage/project1/database/DatabaseAccessor.java
- testsrc/com/mypackage/project1/database/DatabaseAccessorTest.java
- testsrc/com/mypackage/project1/database/DatabaseAccessorSystemTest.java
以这种方式分离事物的原因之一是确保在生产中不会运行任何测试代码;如果 verifyTest
方法位于同一个类中,则没有什么可以阻止您在类中调用它,或者更糟糕的是,从代码库中的其他位置调用它。您还可以避免在生产代码中依赖 junit.jar。
如果您希望在生产代码中进行断言以避免不一致的状态或非法参数,那就是另一回事了,您应该避免使用 JUnit 的 Assert
类 - 或者,就此而言、 assert
语句(根据 javac
的参数编译出来)。相反,更喜欢像 Guava 的 Preconditions
这样的库.
关于java - JUnit 测试可以从返回断言的对象解析吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12755410/