Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java junit测试用例中异常的断言输出错误_Java_Unit Testing_Exception_Junit_Exception Handling - Fatal编程技术网

Java junit测试用例中异常的断言输出错误

Java junit测试用例中异常的断言输出错误,java,unit-testing,exception,junit,exception-handling,Java,Unit Testing,Exception,Junit,Exception Handling,我已经在junit中为getStackTrace()方法编写了这个测试用例: 但这是失败的。我如何纠正它以及它失败的原因? 错误是assert正在获取异常。 我应该如何避免这种情况。我稍微简化了您的代码,以向您表明没有什么例外。没有功能更改,我只删除了死代码。代码可以归结为: public class xyzExceptionTest { private String message; private String source; private

我已经在junit中为getStackTrace()方法编写了这个测试用例:

但这是失败的。我如何纠正它以及它失败的原因? 错误是assert正在获取异常。
我应该如何避免这种情况。

我稍微简化了您的代码,以向您表明没有什么例外。没有功能更改,我只删除了死代码。代码可以归结为:

public class xyzExceptionTest {
        private String message;
        private String source;
        private xyzException obj;

        @Before
        public void setUp() throws Exception {
            message = "Exception";
            source = "source";
            obj = new xyzException(source, "MyObject.class", new NullPointerException(), message);
        }
        @Test
        public void getStackTraceTest() {
            assertEquals("GetStackTrace unexpected Value", "MyObject.class",xyzException.getStackTrace(obj));
        }
}

现在,您可以看到,
XyzException
类现在什么都不是,它只是用传递的
消息调用父构造函数,没有别的

静态的
getStackTrace(XyzException e)
方法也没有任何作用。它接受传递的异常并将其堆栈跟踪作为一个长字符串返回。在我的设置中,堆栈跟踪如下所示:

你到底为什么希望
“MyObject.class”
出现在那里的任何地方?代码按其应有的方式工作,请参见例如


从头开始,定义您的类和预期行为,然后编写测试以验证所述行为。现在,测试完全错了。

用正确的方法编辑了assertEquals。我明白了。这里的代码充满了“lil错误”。例如,它不编译,因为没有字段
mSource
mobjectError
mCause
。它们看起来微不足道,因为它们未被使用。是否应该使用它们?问题归根结底是,为什么希望
新的NullPointerException().printStackTrace()
调用返回“MyObject.class”。您想要实现的到底是什么?正如我刚才介绍的代码的主要部分一样,它是正确编译的。我将编辑并声明mObject,mSource。我试着看看它与异常一起使用时的行为。在s.o.p上,上述方法返回MyObject.class。我正试图弄清楚,但它给出了异常错误。为什么希望XYZEException.getStackTrace返回MobjectError?根据您的代码,它应该返回对传递的异常的printStackTrace调用。所有这些都应该在调用Throwable类的printStackTrace时结束,该类的行为与您期望的完全不同
public class xyzExceptionTest {
        private String message;
        private String source;
        private xyzException obj;

        @Before
        public void setUp() throws Exception {
            message = "Exception";
            source = "source";
            obj = new xyzException(source, "MyObject.class", new NullPointerException(), message);
        }
        @Test
        public void getStackTraceTest() {
            assertEquals("GetStackTrace unexpected Value", "MyObject.class",xyzException.getStackTrace(obj));
        }
}
public class XyzException extends Exception {

    public static String getStackTrace(XyzException e) {
        StringWriter sw = new StringWriter();
        try (PrintWriter w = new PrintWriter(sw)) {
            e.printStackTrace(w);
            return sw.toString();
        } 
    }

    public XyzException(String message) {
        super(message);
    }

}
public class XyzExceptionTest {
    private String message;
    private XyzException exception;

    @Before
    public void setUp() throws Exception {
        message = "A message";
        exception = new XyzException(message);
    }

    @Test
    public void getStackTraceTest() {
        System.out.println(XyzException.getStackTrace(obj));
        assertEquals("GetStackTrace unexpected Value", "MyObject.class", XyzException.getStackTrace(exception));
    }
}
cz.slanec.playground.XyzException: A message
    at cz.slanec.playground.XyzExceptionTest.setUp(XyzExceptionTest.java:15)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:24)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)