2014-12-04 6 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 с надлежащим методом .. –

+0

Я вижу. Код здесь заполнен «lil errors». Например, он не компилируется, потому что нет полей 'mSource',' mObjectInError' и 'mCause'. Они кажутся незначительными, поскольку они не используются. Должны ли они использоваться? –

+1

Проблема сводится к тому, почему вы ожидаете «нового NullPointerException(). PrintStackTrace()' call для возврата «MyObject.class». Что именно вы пытаетесь достичь? –

ответ

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().

Начните с нуля, определите свой класс и предполагаемое поведение, а затем напишите тесты для проверки указанного поведения. Прямо сейчас, тест не соответствует действительности.

Смежные вопросы