Home | History | Annotate | Download | only in util
      1 /*
      2  * Copyright (c) 2007 Mockito contributors
      3  * This program is made available under the terms of the MIT License.
      4  */
      5 package org.mockito.internal.junit.util;
      6 
      7 import java.lang.reflect.Field;
      8 import org.junit.runner.notification.Failure;
      9 import org.mockito.internal.exceptions.ExceptionIncludingMockitoWarnings;
     10 
     11 @Deprecated
     12 public class JUnitFailureHacker {
     13 
     14     public void appendWarnings(Failure failure, String warnings) {
     15         if (isEmpty(warnings)) {
     16             return;
     17         }
     18         //TODO: this has to protect the use in case jUnit changes and this internal state logic fails
     19         Throwable throwable = (Throwable) getInternalState(failure, "fThrownException");
     20 
     21         String newMessage = "contains both: actual test failure *and* Mockito warnings.\n" +
     22                 warnings + "\n *** The actual failure is because of: ***\n";
     23 
     24         ExceptionIncludingMockitoWarnings e = new ExceptionIncludingMockitoWarnings(newMessage, throwable);
     25         e.setStackTrace(throwable.getStackTrace());
     26         setInternalState(failure, "fThrownException", e);
     27     }
     28 
     29     private boolean isEmpty(String warnings) {
     30         return warnings == null || "".equals(warnings); // isEmpty() is in JDK 6+
     31     }
     32 
     33     private static Object getInternalState(Object target, String field) {
     34         Class<?> c = target.getClass();
     35         try {
     36             Field f = getFieldFromHierarchy(c, field);
     37             f.setAccessible(true);
     38             return f.get(target);
     39         } catch (Exception e) {
     40             throw new RuntimeException("Unable to get internal state on a private field. Please report to mockito mailing list.", e);
     41         }
     42     }
     43 
     44     private static void setInternalState(Object target, String field, Object value) {
     45         Class<?> c = target.getClass();
     46         try {
     47             Field f = getFieldFromHierarchy(c, field);
     48             f.setAccessible(true);
     49             f.set(target, value);
     50         } catch (Exception e) {
     51             throw new RuntimeException("Unable to set internal state on a private field. Please report to mockito mailing list.", e);
     52         }
     53     }
     54 
     55     private static Field getFieldFromHierarchy(Class<?> clazz, String field) {
     56         Field f = getField(clazz, field);
     57         while (f == null && clazz != Object.class) {
     58             clazz = clazz.getSuperclass();
     59             f = getField(clazz, field);
     60         }
     61         if (f == null) {
     62             throw new RuntimeException(
     63                     "You want me to get this field: '" + field +
     64                             "' on this class: '" + clazz.getSimpleName() +
     65                             "' but this field is not declared within the hierarchy of this class!");
     66         }
     67         return f;
     68     }
     69 
     70     private static Field getField(Class<?> clazz, String field) {
     71         try {
     72             return clazz.getDeclaredField(field);
     73         } catch (NoSuchFieldException e) {
     74             return null;
     75         }
     76     }
     77 }
     78