Java JUnit测试能否解析返回断言的对象?

Java JUnit测试能否解析返回断言的对象?,java,junit,assert,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 v

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的部分意图是拥有与代码类分离的干净的测试类。这样,测试可以单独发展,并且通常甚至不需要更改,除非类的接口发生更改。在我的代码中,我将它们放在一个单独的“源文件夹”中的同一个包中,因此您有:

  • 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这样的库。

我在开发人员进行BDD风格测试的项目上见过这种类型的测试。这样做的好处是代码可读性很强,但缺点是作为一个单元测试太抽象了,因此理解一个类或方法做什么并不容易。有没有理由不使用某种部分模拟和/或powermock框架来检查内部状态?也许我遗漏了什么。assertTrue的类型是void,而不是Assert。我在这里真正想知道的是,“有人在web黑盒测试中使用这种设计模式吗”或者这是我对JUnit的误解吗?一种将测试代码排除在生产代码之外的方法是创建被测类的子类。在子类中,可以声明runTest和verifyTest等方法。当然,这假设受保护的接口足以进行测试。另一个技巧是将测试类与被测试的类放在同一个包中。这使您可以访问包级接口。@Theodore我不喜欢测试的继承,因为它似乎滥用了继承,但(如答案中的路径)就像您所指出的原因一样,将东西放在同一个包中。这对于像这样的注释尤其有效。这两种方法都可以让您在Java中测试“受保护”的方法。对于其他语言,子类化可能是测试受保护方法的最佳方法。