2014-12-04 81 views
0
public class xyzException extends Exception{ 
    private final Object mSource; 
    private final Object mObjectInError; 
    private final Throwable mCause; 

    public xyzException(Object obj1, Object obj2, Throwable cause, String message){ 
     super(message); 
     this.mSource = obj1; 
     this.mObjectInError = obj2; 
     this.mCause = cause; 
    } 

    public static String getStackTrace(xyzException e) { 
     StringWriter sw = new StringWriter(); 
     PrintWriter w = new PrintWriter(sw); 
     e.printStackTrace(w); 
     try { 
      w.close(); 
     } 
     catch (final Exception ignore) { 
     } 
     return sw.toString(); 
    } 

我都要在JUnit写了这个测试用例的getStackTrace()方法:错误输出断言在JUnit测试案例例外

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)); 
     } 
} 

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

+0

用适当的方法编辑assertEquals .. – 2014-12-04 10:21:24

+0

我明白了。这里的代码充满了“小错误”。例如,它不会编译,因为没有字段'mSource','mObjectInError'和'mCause'。它们似乎不重要,因为它们未被使用。他们是否应该使用? – 2014-12-04 10:27:26

+1

问题归结于为什么您会期望'new NullPointerException()。printStackTrace()'调用返回“MyObject.class”。你想要达到什么目标? – 2014-12-04 10:28:51

回答

0

我有点简化了你的代码,告诉你没有什么特殊之处。没有功能改变,我只删除死码。然后,该代码归结为:

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)); 
    } 
} 

现在,你可以看到XyzException类是什么,现在,它只是调用父类的构造与传递message,没有别的。

静态getStackTrace(XyzException e)方法也没有什么花哨。它接受通过的异常并将其堆栈跟踪作为一个长字符串返回。在我的设置,即堆栈跟踪看起来是这样的:

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) 

为什么地球上,你会期望"MyObject.class"到有没有什么地方出现?代码正常工作,请参阅Throwable#printStackTrace()

从零开始,定义你的类和预期的行为,然后编写测试来验证上述行为。目前,测试是错误的。