package org.projectusus.autotestsuite.core.internal.config;
import static org.mockito.MockitoAnnotations.initMocks;
import java.util.Collection;
import org.junit.rules.MethodRule;
import org.junit.runners.model.FrameworkMethod;
import org.junit.runners.model.Statement;
import org.mockito.Mockito;
import com.google.common.collect.LinkedListMultimap;
import com.google.common.collect.Multimap;
public class Mockery implements MethodRule {
private final Multimap<Class<?>, MockInitializer<?, ?>> initializers = LinkedListMultimap.create();
public Statement apply( final Statement base, FrameworkMethod method, final Object target ) {
return new Statement() {
@Override
public void evaluate() throws Throwable {
initMocks( target );
base.evaluate();
}
};
}
public Mockery with( MockInitializer<?, ?> initializer ) {
initializers.put( initializer.classToMock(), initializer );
return this;
}
public <T, V> T mock( Class<T> clazz, V value ) {
T mock = mock( clazz );
Collection<MockInitializer<?, ?>> classInitializers = initializers.get( clazz );
if( classInitializers != null ) {
for( MockInitializer<?, ?> initializer : classInitializers ) {
cast( initializer ).prepare( mock, value );
}
}
return mock;
}
public <T> T mock( Class<T> clazz ) {
return Mockito.mock( clazz );
}
@SuppressWarnings( "unchecked" )
private <T, V> MockInitializer<T, V> cast( MockInitializer<?, ?> initializer ) {
return ((MockInitializer<T, V>)initializer);
}
}