Home | History | Annotate | Download | only in mockitoutil
      1 /*
      2  * Copyright (c) 2007 Mockito contributors
      3  * This program is made available under the terms of the MIT License.
      4  */
      5 
      6 package org.mockitoutil;
      7 
      8 import org.junit.After;
      9 import org.junit.Before;
     10 import org.mockito.MockitoAnnotations;
     11 import org.mockito.StateMaster;
     12 import org.mockito.internal.MockitoCore;
     13 import org.mockito.internal.configuration.ConfigurationAccess;
     14 import org.mockito.internal.debugging.LocationImpl;
     15 import org.mockito.internal.invocation.InvocationBuilder;
     16 import org.mockito.internal.invocation.InvocationImpl;
     17 import org.mockito.internal.invocation.InvocationMatcher;
     18 import org.mockito.internal.invocation.SerializableMethod;
     19 import org.mockito.internal.invocation.realmethod.RealMethod;
     20 import org.mockito.invocation.Invocation;
     21 
     22 import java.io.ByteArrayOutputStream;
     23 import java.io.IOException;
     24 import java.io.PrintStream;
     25 
     26 import static org.mockito.Mockito.mock;
     27 
     28 /**
     29  * the easiest way to make sure that tests clean up invalid state is to require
     30  * valid state for all tests.
     31  */
     32 public class TestBase {
     33 
     34     @After
     35     public void cleanUpConfigInAnyCase() {
     36         ConfigurationAccess.getConfig().overrideCleansStackTrace(false);
     37         ConfigurationAccess.getConfig().overrideDefaultAnswer(null);
     38         StateMaster state = new StateMaster();
     39         //catch any invalid state left over after test case run
     40         //this way we can catch early if some Mockito operations leave weird state afterwards
     41         state.validate();
     42         //reset the state, especially, reset any ongoing stubbing for correct error messages of tests that assert unhappy paths
     43         state.reset();
     44     }
     45 
     46     @Before
     47     public void init() {
     48         MockitoAnnotations.initMocks(this);
     49     }
     50 
     51     public static void makeStackTracesClean() {
     52         ConfigurationAccess.getConfig().overrideCleansStackTrace(true);
     53     }
     54 
     55     public void resetState() {
     56         new StateMaster().reset();
     57     }
     58 
     59     public static Invocation getLastInvocation() {
     60         return new MockitoCore().getLastInvocation();
     61     }
     62 
     63     protected static Invocation invocationOf(Class<?> type, String methodName, Object ... args) throws NoSuchMethodException {
     64         Class<?>[] types = new Class<?>[args.length];
     65         for (int i = 0; i < args.length; i++) {
     66             types[i] = args[i].getClass();
     67         }
     68         return new InvocationImpl(mock(type), new SerializableMethod(type.getMethod(methodName,
     69                 types)), args, 1, null, new LocationImpl());
     70     }
     71 
     72     protected static Invocation invocationOf(Class<?> type, String methodName, RealMethod realMethod) throws NoSuchMethodException {
     73         return new InvocationImpl(new Object(), new SerializableMethod(type.getMethod(methodName,
     74                 new Class<?>[0])), new Object[0], 1, realMethod, new LocationImpl());
     75     }
     76 
     77     protected static Invocation invocationAt(String location) {
     78         return new InvocationBuilder().location(location).toInvocation();
     79     }
     80 
     81     protected static InvocationMatcher invocationMatcherAt(String location) {
     82         return new InvocationBuilder().location(location).toInvocationMatcher();
     83     }
     84 
     85     protected String getStackTrace(Throwable e) {
     86         ByteArrayOutputStream out = new ByteArrayOutputStream();
     87         e.printStackTrace(new PrintStream(out));
     88         try {
     89             out.close();
     90         } catch (IOException ex) {}
     91         return out.toString();
     92     }
     93 
     94     /**
     95      * Filters out unwanted line numbers from provided stack trace String.
     96      * This is useful for writing assertions for exception messages that contain line numbers.
     97      *
     98      * For example it turns:
     99      * blah blah (UnusedStubsExceptionMessageTest.java:27)
    100      * into:
    101      * blah blah (UnusedStubsExceptionMessageTest.java:0)
    102      */
    103     public static String filterLineNo(String stackTrace) {
    104         return stackTrace.replaceAll("(\\((\\w+\\.java):(\\d)+\\))", "($2:0)");
    105     }
    106 }
    107