2010-02-11 26 views
0

。在我的测试类我有类似如下的方法:Junit的(3.8.1)测试,一个异常被抛出(工作在单元测试中,当加入到测试套件失败)我想测试我抛出一个异常,在适当的时候

public void testParseException() { 

    try { 
     ClientEntitySingleton.getInstance(); 
     fail("should have thrown exception."); 
    } catch (RuntimeException re) { 
     assertEquals(
      "<exception message>", 
      re.getMessage()); 
    } 
} 

这工作正常(绿坝),每当我运行单元测试单一类。但是,当我将这个测试添加到testSuite时,我得到一个红色的条单元测试失败报告的异常。

还有一件事...它在testSuite中工作,如果它是套件中的第一个测试。实际上,我正在做这些测试中的两个,并且发现如果我将它们作为套件中的前两个测试,一切都很好,但如果在“常规”测试之前进行测试,则会发生此故障。所以我有一个解决方法,但没有真正的答案。

任何想法?

的 “失败”

了java.lang.RuntimeException的Heres'a堆栈跟踪:ProcEntity客户DN = “XXXXXX/XXXX/XXX” 被定义多次。 在com.someco.someprod.clientEntityManagement.ClientEntitySingleton.addClientEntity(ClientEntitySingleton.java:247) 在com.someco.someprod.clientEntityManagement.ClientEntitySingleton.startElement(ClientEntitySingleton.java:264) 在org.apache.xerces.parsers。 AbstractSAXParser.startElement(来源不明) 在org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanStartElement(来源不明) 在org.apache.xerces.impl.XMLDocumentFragmentScannerImpl $ FragmentContentDispatcher.dispatch(来源不明) 在org.apache.xerces .impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source) at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source) at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source) at org.apache.xerces.parsers.XMLParser.parse(Unknown Source) at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source) at com.someco.someprod.clientEntityManagement.ClientEntitySingleton.parse(ClientEntitySingleton。的java:216) 在com.someco.someprod.clientEntityManagement.ClientEntitySingleton.reload(ClientEntitySingleton.java:303) 在com.someco.someprod.clientEntityManagement.ClientEntitySingleton.setInputSourceProvider(ClientEntitySingleton.java:88) 在com.someco。 sometest.clientEntityManagement.test.TestClientBase.setUp(TestClientBase.java:17) at com.someco.someprod.clientEntityManagement.test.TestClientEntityDup.setUp(TestClientEntityDup.java:8) at junit.framework.TestCase.runBare(TestCase。 java:125) at junit.framework.TestResult $ 1.protect(TestResult.java:106) at junit.framework.TestResult.runProtected(TestResult.java:124) at junit.framework.TestResult.run(TestResult.java:109) 在junit.framework.TestCase.run(TestCase.java:118) 在junit.framework.TestSuite.runTest(TestSuite.java:208) 在junit.framework.TestSuite.run(TestSuite.java:203) 在junit的.framework.TestSuite.runTest(TestSuite.java:208) at junit.framework.TestSuite.run(TestSuite.java:203) at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference的.java:128) 在org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 在org.eclipse.jdt.inter nal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673) at org.eclipse.jdt.internal。 junit.runner.RemoteTestRunner.run(RemoteTestRunner。java:386) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)

回答

0

刚才意识到我从未发布过这个问题的“答案”。

ClientEntitySingleton被设置为初始化时,它会简单地缓存要加载的xml文件的名称。它在第一个引用上加载,并且一旦加载了单例数据后,如果更改了文件名,它将被重新加载。

所以,只要失败发生在成功加载之前,解析发生在测试用例(第一次访问)期间。一旦我成功加载了一个XML文件,以后对源文件属性的任何更改都会立即解析XML文件。不幸的是,我在测试设置方法中设置了文件名。 (这实际上就在堆栈跟踪中。)

因此,如果您认为JUnit没有使用测试例外,那么这不是您的确认。

2

没有看到剩下的代码就很难说,但是还有其他的测试正在使用ClientEntitySingleton并调用其getInstance方法?如果你有一个懒惰的init单例,那么它将不会被多次初始化。

你有没有尝试将测试分叉到单独的JVM,看看你是否仍然存在这个问题?

+0

我认为,单身人士有一些残留,但它仍然是在这两种情况下,代码抛出异常。当单独运行时,它会触发我的catch子句并执行assertEquals,而当它是testSuite的一部分时,它永远不会触发assertEquals。 JUnit仅捕获异常并将异常本身报告为测试失败。 – 2010-02-12 02:10:45

+0

当它是测试套件的一部分时,是否会引发非RuntimeException异常(也可能是来自单例的影响)?也许多次初始化单例实际上是造成异常。由于您只捕获RuntimeException,所以测试套件中将显示非RuntimeException并由测试运行器报告。 – 2010-02-12 03:26:23

+0

这是我故意抛出的同一个RuntimeException(并且我在测试中捕获它时是独立的)。在testSuite JUnit在我的catch子句之前得到它,并将其称为测试失败。很奇怪。 – 2010-02-12 11:15:16

0

我建议你别抓RuntimeException,它有大约1000个小类。

根据你班级的名字,听起来好像你只期待ParseException。这就是你在测试中应该抓住的。

最后,假设您在IDE中运行这些测试(因为引用了红色/绿色条),您应该检查该案例的失败消息--JUnit应报告预期消息的内容与实际的消息是。这将帮助您诊断实际发生的情况,这应该可以帮助您找出为什么当测试独立运行时可能会遇到某种类型的行为,并且会以组的形式运行。

+0

实际上,它抛出了RuntimeException(不是子类)。我得到的错误与assertEquals不匹配,但仅仅是引发异常的测试失败。它运行得很好,单独运行时运行assertEquals。它只会失败,当它成为testSuite – 2010-02-12 02:08:23

+0

的一部分我会尝试子类化RuntimeException,抛出子类并显式捕获它(这有点“懒惰”,只是抛出RuntimeException)。我不知道为什么这应该有所作为,但我也不确定为什么我将它添加到testSuite时看到了差异。所以,值得一试。 – 2010-02-12 02:15:52

+0

只是增加了更多的细节re:testSuite中测试排序的影响。 – 2010-02-12 14:19:07

相关问题