在使用square改进框架时,模拟服务器进行测试的最佳方法是什么。
可能的方式:
>
创建一个新的改装客户端,并在RestAdapter中设置它。Builder(). setClient().这包括解析请求对象,并将json作为响应对象返回。
将这个带注释的接口实现为一个模拟类,并使用它代替RestAdapter提供的版本。create()(不会测试gson序列化)
?
理想情况下,我想让mocked服务器提供json响应,这样我就可以同时测试gson序列化。
任何例子都将不胜感激。
测试对象的JSON反序列化(可能使用TypeAdapters
?)似乎是一个需要单独单元测试的单独问题。
我个人使用版本2。它提供了类型安全、重构友好的代码,可以轻松调试和更改。毕竟,如果您不创建用于测试的替代版本,那么将您的API声明为接口有什么好处呢?多态性的胜利。
另一个选项是使用JavaProxy
。这实际上是改造(目前)实现其底层HTTP交互的方式。诚然,这将需要更多的工作,但将允许更多的动态模拟。
我决定尝试方法1如下
public class MockClient implements Client {
@Override
public Response execute(Request request) throws IOException {
Uri uri = Uri.parse(request.getUrl());
Log.d("MOCK SERVER", "fetching uri: " + uri.toString());
String responseString = "";
if(uri.getPath().equals("/path/of/interest")) {
responseString = "JSON STRING HERE";
} else {
responseString = "OTHER JSON RESPONSE STRING";
}
return new Response(request.getUrl(), 200, "nothing", Collections.EMPTY_LIST, new TypedByteArray("application/json", responseString.getBytes()));
}
}
并通过以下方式使用它:
RestAdapter.Builder builder = new RestAdapter.Builder();
builder.setClient(new MockClient());
它工作良好,允许您测试json字符串,而无需联系真正的服务器!
由于像创建MockClient
类和从Client
实现它这样的旧机制不再适用于Retromet 2.0,这里我描述了一种新的方法。FakeInterceptor
类只是重写了拦截
方法,如果应用程序处于DEBUG
模式,则返回给定的JSON。
public final class RestClient {
private static IRestService mRestService = null;
public static IRestService getClient() {
if(mRestService == null) {
final OkHttpClient client = new OkHttpClient();
// ***YOUR CUSTOM INTERCEPTOR GOES HERE***
client.interceptors().add(new FakeInterceptor());
final Retrofit retrofit = new Retrofit.Builder()
// Using custom Jackson Converter to parse JSON
// Add dependencies:
// com.squareup.retrofit:converter-jackson:2.0.0-beta2
.addConverterFactory(JacksonConverterFactory.create())
// Endpoint
.baseUrl(IRestService.ENDPOINT)
.client(client)
.build();
mRestService = retrofit.create(IRestService.class);
}
return mRestService;
}
}
public interface IRestService {
String ENDPOINT = "http://www.vavian.com/";
@GET("/")
Call<Teacher> getTeacherById(@Query("id") final String id);
}
public class FakeInterceptor implements Interceptor {
// FAKE RESPONSES.
private final static String TEACHER_ID_1 = "{\"id\":1,\"age\":28,\"name\":\"Victor Apoyan\"}";
private final static String TEACHER_ID_2 = "{\"id\":1,\"age\":16,\"name\":\"Tovmas Apoyan\"}";
@Override
public Response intercept(Chain chain) throws IOException {
Response response = null;
if(BuildConfig.DEBUG) {
String responseString;
// Get Request URI.
final URI uri = chain.request().url().uri();
// Get Query String.
final String query = uri.getQuery();
// Parse the Query String.
final String[] parsedQuery = query.split("=");
if(parsedQuery[0].equalsIgnoreCase("id") && parsedQuery[1].equalsIgnoreCase("1")) {
responseString = TEACHER_ID_1;
}
else if(parsedQuery[0].equalsIgnoreCase("id") && parsedQuery[1].equalsIgnoreCase("2")){
responseString = TEACHER_ID_2;
}
else {
responseString = "";
}
response = new Response.Builder()
.code(200)
.message(responseString)
.request(chain.request())
.protocol(Protocol.HTTP_1_0)
.body(ResponseBody.create(MediaType.parse("application/json"), responseString.getBytes()))
.addHeader("content-type", "application/json")
.build();
}
else {
response = chain.proceed(chain.request());
}
return response;
}
}
GitHub上项目的源代码
问题内容: 我有一个ParseService,我想对其进行模拟以测试使用它的所有控制器,我一直在阅读有关茉莉花间谍的信息,但对我来说仍然不清楚。谁能给我一个关于如何模拟定制服务并在Controller测试中使用它的示例吗? 现在,我有一个使用服务插入书的控制器: 服务是这样的: 到目前为止,我的测试如下所示: 现在测试失败: 我做错了什么? 问题答案: 我做错的是没有在beforeEach中将模拟
我的目标是建立一个环境,让CircleCI在不同的浏览器中运行BrowserStack上的e2e测试。 我的测试假设有一个模拟服务器在运行。(例如,测试正在检查是否已对模拟服务器进行了某个调用。)
在工作中,我们完全测试GUI组件。问题产生于这样一个事实:当testsuite运行时,各种组件会弹出,窃取焦点或使其无法继续工作。我想到的第一件事是Xnest,但我想知道是否有更优雅的解决方案来解决这个问题。
假设应用程序依赖于外部服务器上的REST服务,http://otherserver.com.为了测试,我想在JUnit环境中模拟外部rest调用(通过Wiremck)。启动单独的服务器会消耗时间,而且不容易。使用Wiremck规则看起来是正确的方向。创建模拟控制器并不是一种优雅的方式,因为Wiremck是可用的。 例如get(" http://other server . com/service
我正在寻找一种方法来模拟Controller中使用的服务bean,这样我就可以使用MockMVC只测试Controller。但是我找不到一个简单的方法来用Spock Mock代替real bean。一切都使用spring-boot 1.3.2版本。更多细节如下: 我有一个以下控制器类 和集成Spock测试: 我需要一种方法来替换这个autowired bean,用一个mock/stub这样我就可以
我正在为Mule ESB应用程序编写集成测试,该应用程序通过HTTPS连接到外部API。我想模拟外部API并在Maven构建期间运行端到端联调。我的问题是关于设置嵌入式HTTPS服务器。我尝试过使用泽西,但它只提供HTTP。我正在看这个例子 https://github.com/jersey/jersey/tree/master/examples/https-clientserver-grizzl