Java Junit(3.8.1)测试是否抛出异常(在单元测试中工作,添加到testSuite时失败)
我试图测试是否在适当的时候抛出异常。在我的测试课程中,我有一个类似于以下的方法:Java Junit(3.8.1)测试是否抛出异常(在单元测试中工作,添加到testSuite时失败),java,unit-testing,exception,junit,Java,Unit Testing,Exception,Junit,我试图测试是否在适当的时候抛出异常。在我的测试课程中,我有一个类似于以下的方法: public void testParseException() { try { ClientEntitySingleton.getInstance(); fail("should have thrown exception."); } catch (RuntimeException re) { assertEquals( "
public void testParseException() {
try {
ClientEntitySingleton.getInstance();
fail("should have thrown exception.");
} catch (RuntimeException re) {
assertEquals(
"<exception message>",
re.getMessage());
}
}
public void testParseException(){
试一试{
ClientEntitySingleton.getInstance();
失败(“应该抛出异常”);
}捕获(运行时异常re){
资产质量(
"",
re.getMessage());
}
}
每当我运行单个unitTest类时,它都可以正常工作(绿色条)。但是,当我将该测试添加到testSuite中时,会在异常中报告一个红色的单元测试失败
还有一件事。。。如果它是测试套件中的第一个测试,那么它在测试套件中工作。事实上,我正在做其中的两个测试,我刚刚发现如果我把它们作为套件中的前两个测试,一切都很好,但是如果之前有一个“常规”测试,我就会失败。所以我有一个解决办法,但没有真正的答案
有什么想法吗
这是“失败”的堆栈跟踪
java.lang.RuntimeException: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.XMLDocumentFragmentScanneImpl.ScandDocument(未知来源)
位于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)上
在com.someco.someprod.clientEntityManagement.ClientEntitySingleton.reload(ClientEntitySingleton.java:303)上
在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)
运行(TestResult.java:109)
运行(TestCase.java:118)
位于junit.framework.TestSuite.runTest(TestSuite.java:208)
运行(TestSuite.java:203)
位于junit.framework.TestSuite.runTest(TestSuite.java:208)
运行(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)上,如果看不到代码的其余部分,很难判断,但是是否还有其他测试使用ClientEntitySingleton并调用其getInstance方法?如果您有一个懒惰的init单例,那么它就不会被多次初始化
您是否尝试过将测试分岔到一个单独的JVM中,看看您是否仍然存在问题?我建议您不要捕获
RuntimeException
,它有大约1000个子类
根据类的名称,听起来好像您只需要ParseException
。这是你在考试中应该掌握的
最后,假设您正在IDE中运行这些测试(由于对红色/绿色条的引用),您应该检查案例的失败消息-JUnit应该报告预期的消息与实际的消息。这将帮助您诊断实际发生的情况,这将帮助您找出为什么在测试单独运行而不是作为一个组运行时会出现一种行为。刚刚意识到我从未发布过此问题的“答案” ClientEntitySingleton的设置是为了在初始化时只缓存要加载的xml文件的名称。它在第一次引用时加载,如果在加载单例数据后更改文件名,则会重新加载 因此,只要失败发生在成功加载之前,解析就发生在测试用例期间(第一次访问)。成功加载XML文件后,将来对源文件属性的任何更改都会触发对XML文件的立即解析。不幸的是,我在测试设置方法中设置了文件名。(这实际上就在堆栈跟踪中。)
因此,如果您认为JUnit不能处理测试异常,那么这不是您的确认。实际上,它抛出了一个RuntimeException(不是子类)。我得到的错误不是assertEquals上的不匹配,而是引发异常的测试失败。单独运行assertEquals时,它运行得很好。只有当它成为testSuiteI的一部分时才会失败。我将尝试子类化RuntimeException,抛出子类并显式捕获它(只是有点“懒惰”)