blob: ca3d7b8744dcb92428f6ffd9ea2c754d5d5ae021 [file] [log] [blame]
/*
* Copyright (c) 2007 Mockito contributors
* This program is made available under the terms of the MIT License.
*/
package org.mockitoutil;
import org.junit.After;
import org.junit.Before;
import org.mockito.MockitoAnnotations;
import org.mockito.StateMaster;
import org.mockito.internal.MockitoCore;
import org.mockito.internal.configuration.ConfigurationAccess;
import org.mockito.internal.invocation.mockref.MockStrongReference;
import org.mockito.internal.invocation.InterceptedInvocation;
import org.mockito.internal.debugging.LocationImpl;
import org.mockito.internal.invocation.InvocationBuilder;
import org.mockito.internal.invocation.InvocationMatcher;
import org.mockito.internal.invocation.SerializableMethod;
import org.mockito.invocation.Invocation;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.PrintStream;
import static org.mockito.Mockito.mock;
/**
* the easiest way to make sure that tests clean up invalid state is to require
* valid state for all tests.
*/
public class TestBase {
@After
public void cleanUpConfigInAnyCase() {
ConfigurationAccess.getConfig().overrideCleansStackTrace(false);
ConfigurationAccess.getConfig().overrideDefaultAnswer(null);
StateMaster state = new StateMaster();
//catch any invalid state left over after test case run
//this way we can catch early if some Mockito operations leave weird state afterwards
state.validate();
//reset the state, especially, reset any ongoing stubbing for correct error messages of tests that assert unhappy paths
state.reset();
}
@Before
public void init() {
MockitoAnnotations.initMocks(this);
}
public static void makeStackTracesClean() {
ConfigurationAccess.getConfig().overrideCleansStackTrace(true);
}
public void resetState() {
new StateMaster().reset();
}
public static Invocation getLastInvocation() {
return new MockitoCore().getLastInvocation();
}
protected static Invocation invocationOf(Class<?> type, String methodName, Object ... args) throws NoSuchMethodException {
Class<?>[] types = new Class<?>[args.length];
for (int i = 0; i < args.length; i++) {
types[i] = args[i].getClass();
}
return new InterceptedInvocation(new MockStrongReference<Object>(mock(type), false),
new SerializableMethod(type.getMethod(methodName, types)), args, InterceptedInvocation.NO_OP,
new LocationImpl(), 1);
}
protected static Invocation invocationAt(String location) {
return new InvocationBuilder().location(location).toInvocation();
}
protected static InvocationMatcher invocationMatcherAt(String location) {
return new InvocationBuilder().location(location).toInvocationMatcher();
}
protected String getStackTrace(Throwable e) {
ByteArrayOutputStream out = new ByteArrayOutputStream();
e.printStackTrace(new PrintStream(out));
try {
out.close();
} catch (IOException ex) {}
return out.toString();
}
/**
* Filters out unwanted line numbers from provided stack trace String.
* This is useful for writing assertions for exception messages that contain line numbers.
*
* For example it turns:
* blah blah (UnusedStubsExceptionMessageTest.java:27)
* into:
* blah blah (UnusedStubsExceptionMessageTest.java:0)
*/
public static String filterLineNo(String stackTrace) {
return stackTrace.replaceAll("(\\((\\w+\\.java):(\\d)+\\))", "($2:0)");
}
/**
* Filters out hashCode from the text. Useful for writing assertions that contain the String representation of mock objects
* @param text to filter
* @return filtered text
*/
public static String filterHashCode(String text) {
return text.replaceAll("hashCode: (\\d)+\\.", "hashCode: xxx.");
}
}