使用moco API快速搭建测试挡板服务的时候,有一些接口需求是随机返回固定的几个响应体,但是moco API提供并未提供此功能,幸好有先前增加limit功能的经验,这次很顺利解决了这个问题。
handle代码如下:
package com.fun.moco.support;
import com.fun.frame.SourceCode;
import com.github.dreamhead.moco.MocoConfig;
import com.github.dreamhead.moco.ResponseHandler;
import com.github.dreamhead.moco.handler.AbstractResponseHandler;
import com.github.dreamhead.moco.internal.SessionContext;
import com.google.common.base.Function;
import com.google.common.collect.FluentIterable;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Iterables;
import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.collect.FluentIterable.from;
import static com.google.common.collect.ImmutableList.copyOf;
/**
* 随机的responsehandle
*/
public class RandomHandler extends AbstractResponseHandler {
private final ImmutableList<ResponseHandler> handlers;
private RandomHandler(final Iterable<ResponseHandler> handlers) {
this.handlers = copyOf(handlers);
}
public static ResponseHandler newSeq(final Iterable<ResponseHandler> handlers) {
checkArgument(Iterables.size(handlers) > 0, "Sequence contents should not be null");
return new RandomHandler(handlers);
}
/**
* getrandom随机获取一个响应
*
* @param context
*/
@Override
public void writeToResponse(final SessionContext context) {
handlers.get(SourceCode.getRandomInt(handlers.size()) - 1).writeToResponse(context);
}
@Override
public ResponseHandler apply(final MocoConfig config) {
if (config.isFor(MocoConfig.RESPONSE_ID)) {
return super.apply(config);
}
FluentIterable<ResponseHandler> transformedResources = from(copyOf(handlers)).transform(applyConfig(config));
return new RandomHandler(transformedResources.toList());
}
private Function<ResponseHandler, ResponseHandler> applyConfig(final MocoConfig config) {
return new Function<ResponseHandler, ResponseHandler>() {
@Override
public ResponseHandler apply(final ResponseHandler input) {
return input.apply(config);
}
};
}
}
封装好的使用方法:
/**
* 随机
* @param content
* @param contents
* @return
*/
static ResponseHandler random(String content, String... contents) {
RandomHandler.newSeq(FluentIterable.from(asIterable(content, contents)).transform(textToResource()))
}
/**
* 随机返回
* @param json
* @param jsons
* @return
*/
static ResponseHandler random(JSONObject json, JSONObject... jsons) {
RandomHandler.newSeq(FluentIterable.from(asIterable(json.toString(), jsons.toList().stream().map { x -> x.toString() }.toArray() as String[])).transform(textToResource()))
}
/**
* 随机
* @param handler
* @param handlers
* @return
*/
static ResponseHandler random(ResponseHandler handler, ResponseHandler... handlers) {
RandomHandler.newSeq(asIterable(handler, handlers))
}
使用方法如下:
server.get(urlOnly("/find")).response(random("43242=342","e343=fdsf","3242"))