package org.test4j.module.jmockit.utility;
import mockit.internal.expectations.RecordAndReplayExecution;
import mockit.internal.expectations.TestOnlyPhase;
import mockit.internal.expectations.argumentMatching.ArgumentMatcher;
import mockit.internal.expectations.argumentMatching.ArgumentMismatch;
import mockit.internal.state.TestRun;
import ext.test4j.hamcrest.Description;
import ext.test4j.hamcrest.Matcher;
import ext.test4j.hamcrest.StringDescription;
/**
* 用于注册或获取当前线程下当前使用的org.jmock.Expectations实例<br>
* 用于expectation参数断言调用org.test4j.hamcrest.iassert.common.intf.IAssert.wanted( )
* 时,向当前的expectation实例注册期望发生的方法等
*
* @author darui.wudr
*/
@SuppressWarnings({ "rawtypes" })
public class ExpectationsUtil {
private static ThreadLocal<Object> jes = new ThreadLocal<Object>();
/**
* 注册当前线程下的mockit.Expectations实例
*
* @param ex
*/
public static void register(mockit.Expectations ex) {
jes.set(ex);
}
/**
* 注册当前线程下的mockit.Verifications实例
*
* @param ex
*/
public static void register(mockit.Verifications ve) {
jes.set(ve);
}
public static boolean isJmockitExpectations() {
Object ex = jes.get();
return ex == null ? false : ex instanceof mockit.Expectations;
}
public static boolean isJmockitVerifications() {
Object ex = jes.get();
return ex == null ? false : ex instanceof mockit.Verifications;
}
/**
* 往mockit.Expectations中增加参数断言
*
* @param matcher
*/
public static void addArgMatcher(ext.test4j.hamcrest.Matcher matcher) {
RecordAndReplayExecution instance = TestRun.getRecordAndReplayForRunningTest(false);
if (instance == null) {
return;
}
TestOnlyPhase currentPhase = instance.getCurrentTestOnlyPhase();
if (currentPhase != null) {
ArgumentMatcher _matcher = convert(matcher);
currentPhase.addArgMatcher(_matcher);
}
}
/**
* 把官方的ext.test4j.hamcrest.Matcher类转换为mockit.external.hamcrest.Matcher类
*
* @param matcher
* @return
*/
public static ArgumentMatcher convert(final Matcher matcher) {
return new ArgumentMatcher() {
@Override
public boolean matches(Object item) {
return matcher.matches(item);
}
@Override
public void writeMismatchPhrase(ArgumentMismatch argumentMismatch) {
Description message = new StringDescription();
matcher.describeTo(message);
argumentMismatch.append(message.toString());
}
};
}
}