当前位置: 首页 > 知识库问答 >
问题:

用于测试的Square改装服务器模拟

西门逸仙
2023-03-14

在使用square改进框架时,模拟服务器进行测试的最佳方法是什么。

可能的方式:

>

  • 创建一个新的改装客户端,并在RestAdapter中设置它。Builder(). setClient().这包括解析请求对象,并将json作为响应对象返回。

    将这个带注释的接口实现为一个模拟类,并使用它代替RestAdapter提供的版本。create()(不会测试gson序列化)

    ?

    理想情况下,我想让mocked服务器提供json响应,这样我就可以同时测试gson序列化。

    任何例子都将不胜感激。

  • 共有3个答案

    郭易安
    2023-03-14

    测试对象的JSON反序列化(可能使用TypeAdapters?)似乎是一个需要单独单元测试的单独问题。

    我个人使用版本2。它提供了类型安全、重构友好的代码,可以轻松调试和更改。毕竟,如果您不创建用于测试的替代版本,那么将您的API声明为接口有什么好处呢?多态性的胜利。

    另一个选项是使用JavaProxy。这实际上是改造(目前)实现其底层HTTP交互的方式。诚然,这将需要更多的工作,但将允许更多的动态模拟。

    丁子石
    2023-03-14

    我决定尝试方法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字符串,而无需联系真正的服务器!

    徐智渊
    2023-03-14

    由于像创建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