Junit(3.8.1)测试抛出异常(在单元测试中工作,在添加到testSuite时失败)

时间:2010-02-11 22:22:24

标签: java unit-testing exception junit

我正在尝试测试我在适当的时候抛出异常。在我的测试类中,我有一个类似于以下的方法:

public void testParseException() {

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

每当我运行单个unitTest类时,这都可以正常工作(绿色条)。但是,当我将该测试添加到testSuite时,我会在异常上报告红色单元测试失败。

还有一件事......它可以在testSuite中运行,如果它是套件中的第一个测试。实际上,我正在进行其中两项测试,并且发现如果我将它们作为套件中的前两个测试,那么一切都很好,但如果在它之前进行“常规”测试,我就会失败。所以我有一个解决方法,但没有真正的答案。

有什么想法吗?

Heres'a“失败”的堆栈痕迹

java.lang.RuntimeException:ProcEntity client dn =“Xxxxxx / Xxxx / XXX”定义了多次。     at com.someco.someprod.clientEntityManagement.ClientEntitySingleton.addClientEntity(ClientEntitySingleton.java:247)     at com.someco.someprod.clientEntityManagement.ClientEntitySingleton.startElement(ClientEntitySingleton.java:264)     在org.apache.xerces.parsers.AbstractSAXParser.startElement(未知来源)     at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanStartElement(Unknown Source)     at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl $ FragmentContentDispatcher.dispatch(Unknown Source)     at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)     在org.apache.xerces.parsers.XML11Configuration.parse(未知来源)     在org.apache.xerces.parsers.XML11Configuration.parse(未知来源)     在org.apache.xerces.parsers.XMLParser.parse(未知来源)     在org.apache.xerces.parsers.AbstractSAXParser.parse(未知来源)     在com.someco.someprod.clientEntityManagement.ClientEntitySingleton.parse(ClientEntitySingleton.java:216)     at com.someco.someprod.clientEntityManagement.ClientEntitySingleton.reload(ClientEntitySingleton.java:303)     at com.someco.someprod.clientEntityManagement.ClientEntitySingleton.setInputSourceProvider(ClientEntitySingleton.java:88)     在com.someco.someprod.clientEntityManagement.test.TestClientBase.setUp(TestClientBase.java:17)     在com.someco.someprod.clientEntityManagement.test.TestClientEntityDup.setUp(TestClientEntityDup.java:8)     在junit.framework.TestCase.runBare(TestCase.java:125)     在junit.framework.TestResult $ 1.protect(TestResult.java:106)     在junit.framework.TestResult.runProtected(TestResult.java:124)     在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)     在junit.framework.TestSuite.run(TestSuite.java:203)     在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.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)     在org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)     在org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)     在org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)

3 个答案:

答案 0 :(得分:2)

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

您是否尝试将测试分成单独的JVM并查看是否仍有问题?

答案 1 :(得分:0)

我建议你不要抓住RuntimeException,它有大约一千个子类。

根据您班级的名称,听起来好像只是期待ParseException。这是你应该在测试中捕获的内容。

最后,假设您在IDE中运行这些测试(因为引用了红色/绿色条),您应该检查案例的失败消息 - JUnit应该报告预期消息与实际消息的内容是。这将有助于您诊断实际发生的情况,这可以帮助您找出当测试运行隔离而不是作为一组运行时可能会出现一种行为的原因。

答案 2 :(得分:0)

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

ClientEntitySingleton已设置好,因此在初始化时,它只会缓存要加载的xml文件的名称。它加载在第一个引用上,如果在加载单例数据后更改文件名,则会重新加载它。

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

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