package net.jxta.test.util; import org.jmock.Mockery; import org.jmock.lib.AssertionErrorTranslator; import org.junit.Test; import org.junit.rules.MethodRule; import org.junit.runners.model.FrameworkMethod; import org.junit.runners.model.Statement; /** * JUnit 4.7 based mockery for JMock - this code is taken from issue * JMOCK-237 in the JMock issue tracker. This code is not yet * available in a released version of JMock, but is essential for * us to mix JMock with rule based tests. */ public class JUnitRuleMockery extends Mockery implements MethodRule { public JUnitRuleMockery() { setExpectationErrorTranslator(AssertionErrorTranslator.INSTANCE); } public Statement apply(final Statement base, final FrameworkMethod method, Object target) { return new Statement() { @Override public void evaluate() throws Throwable { try { base.evaluate(); } catch(Throwable exp) { if(!isExceptionExpectedByTestMethod(exp, method)) { throw exp; } } assertIsSatisfied(); } }; } protected boolean isExceptionExpectedByTestMethod(Throwable exp, FrameworkMethod method) { Test test = method.getAnnotation(Test.class); return test.expected().equals(exp.getClass()); } }