All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.jmock.integration.junit4.JUnitRuleMockery Maven / Gradle / Ivy

There is a newer version: 2.13.1
Show newest version
package org.jmock.integration.junit4;

import org.jmock.auto.internal.Mockomatic;
import org.jmock.internal.AllDeclaredFields;
import org.junit.rules.MethodRule;
import org.junit.runners.model.FrameworkMethod;
import org.junit.runners.model.Statement;

import java.lang.reflect.Field;
import java.util.List;

import static org.junit.Assert.fail;

/**
 * A JUnitRuleMockery is a JUnit Rule that manages JMock expectations
 * and allowances, and asserts that expectations have been met after each test
 * has finished. To use it, add a field to the test class (note that you don't 
 * have to specify @RunWith(JMock.class) any more). For example,  
 * 
 * 
public class ATestWithSatisfiedExpectations {
 *  @Rule public final JUnitRuleMockery context = new JUnitRuleMockery();
 *  private final Runnable runnable = context.mock(Runnable.class);
 *     
 *  @Test
 *  public void doesSatisfyExpectations() {
 *    context.checking(new Expectations() {{
 *      oneOf (runnable).run();
 *    }});
 *          
 *    runnable.run();
 *  }
 *}
* * Note that the Rule field must be declared public and as a JUnitRuleMockery * (not a Mockery) for JUnit to recognise it, as it's checked statically. * * @author smgf */ public class JUnitRuleMockery extends JUnit4Mockery implements MethodRule { private final Mockomatic mockomatic = new Mockomatic(this); public Statement apply(final Statement base, FrameworkMethod method, final Object target) { return new Statement() { @Override public void evaluate() throws Throwable { prepare(target); base.evaluate(); assertIsSatisfied(); } private void prepare(final Object target) { List allFields = AllDeclaredFields.in(target.getClass()); assertOnlyOneJMockContextIn(allFields); fillInAutoMocks(target, allFields); } private void assertOnlyOneJMockContextIn(List allFields) { Field contextField = null; for (Field field : allFields) { if (JUnitRuleMockery.class.isAssignableFrom(field.getType())) { if (null != contextField) { fail("Test class should only have one JUnitRuleMockery field, found " + contextField.getName() + " and " + field.getName()); } contextField = field; } } } private void fillInAutoMocks(final Object target, List allFields) { mockomatic.fillIn(target, allFields); } }; } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy