0

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() );
  }
}
4

1 回答 1

1

大多数 Assert 调用AssertionError如果失败就会抛出一个错误,因此代码看起来与您放置的方式不完全相同,但您的代码可以稍微调整并编译/运行。因为它们是作为异常实现的,所以您可以从任何地方调用 Assert 方法,包括您为帮助更轻松地运行测试而设置的任何帮助程序类,只要您愿意,就可以在堆栈深处调用。

编辑:如果您需要对许多对象进行一组类似的断言,我非常建议您设置帮助程序类。我误解并认为您TestObject的系统是您正在测试的系统;其余的则适用于这种情况。

==

没有什么可以阻止您从Assert被测类中调用方法,但是 JUnit 的部分意图是拥有与您的代码类分开的干净的测试类。这样,测试可以单独发展,并且通常甚至不需要更改,除非您的类的接口发生更改。在我的代码中,我将它们放在一个单独的“源文件夹”中的同一个包中,所以你有:

  • 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

于 2012-10-06T03:32:04.897 回答