java - JUnit 测试可以从返回断言的对象解析吗?

标签 java junit assert

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/

相关文章:

java - Swing:让我的简单 GUI 发挥作用时遇到问题

c - 我删除结构条目的代码没有删除,我不明白为什么

java - 运行时是否会忽略断言语句?

nunit - 使用 Assert 比较两个对象

Java new 关键字与静态内部类

java - 我怎样才能在html表格中显示动态值

java - 在java中查找两个多重集的交集

java - Mockito - 检查是否在对象上调用了 NO 方法(未访问对象)

java - 执行所有测试后清理(spock 框架)

java - IntelliJ 无法找到测试上下文