2012-10-05 58 views
0

JUnit测试能否从返回断言的对象中解析?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()); 
    } 
} 
+0

我在开发人员进行BDD风格测试的项目上看到过这种类型的测试。这样做的好处是代码的可读性非常好,但作为单元测试的缺点太抽象了,所以了解类或方法的作用并不是微不足道的。 – Augusto

+0

有没有理由不使用某种部分模拟和/或powermock框架来检查内部状态? – JoshC13

+0

也许我错过了一些东西。 assertTrue的类型是void,而不是Assert。 –

回答

0

大多数断言调用抛出AssertionError如果他们失败了,所以代码不会看正是你把它的方式,但你的代码可能会稍微调整和编译/运行。因为它们是作为异常实现的,所以可以从任何地方调用Assert方法,包括您设置的任何助手类,以帮助您更轻松地运行测试,就像堆栈中的深度一样。

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

==

没有什么可以阻止你打电话从被测类中Assert方法,但部分的意向JUnit是有是从您的代码类单独干净的测试类。这样,测试可以单独进行,通常甚至不需要改变,除非班级的界面改变。在我的代码,我把它们放在同一封装在一个单独的 “源文件夹”,让你有:

  • 的src/COM/mypackage中/ PROJECT1 /数据库/ DatabaseAccessor.java
  • testsrc/COM/mypackage的/project1/database/DatabaseAccessorTest.java
  • testsrc/COM/mypackage中/ PROJECT1 /数据库/ DatabaseAccessorSystemTest.java

一个分隔东西,这个办法是,以确保没有测试代码是不断运行的原因生产;如果verifyTest方法在同一个类中,没有什么能阻止你在你的类中调用它 - 或者更糟糕的是,从你的代码库中的其他类调用它。您还避免依赖生产代码中的junit.jar。

如果你正在寻找使生产代码断言,以避免不一致的状态或非法参数,这是一个不同的问题,一个是你应该避免JUnit的Assert类 - 或者,就此而言,assert声明(这是根据参数javac编译)。相反,喜欢像番石榴的Preconditions这样的图书馆。

+0

将测试代码保留在生产代码之外的一种方法是创建被测试类的子类。在子类中,您可以声明runTest和verifyTest等方法。当然,这假定受保护的接口足以进行测试。另一个诀窍是将测试类放在与被测试类相同的包中。这使您可以访问包级别的界面。 –

+0

@Theodore我不喜欢继承进行测试,因为它似乎滥用继承,但(如答案中的路径),就像将事情放在同一个包中,完全是因为您提到的原因。这对于像['@ VisibleForTesting']这样的注释特别有效(http://docs.guava-libraries.googlecode.com/git-history/v10.0.1/javadoc/com/google/common/annotations/VisibleForTesting.html )。 –

+0

这两种方法都允许您在Java中测试“受保护”方法。对于其他语言,子类化可能是测试受保护方法的最佳方法。 –