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

机器人分子改造单元试验

从光启
2023-03-14

我有一个项目,使用改造映射API 2.0.2.

它工作得很好,所以我决定写一些功能测试,以确保它在将来正常工作。出于多方面的原因,我希望他们用完任何Android设备或模拟器。

问题是,我使用了一些Android类(比如Base64),所以我需要一个环境,这就是为什么我决定使用Robolector3.0。

为了伪造我的API(纯单元测试)的响应,我使用了OkHttp拦截器,几乎在所有地方都有解释。

问题是,当我从AndroidStudio(2.x)运行测试时,一切正常。但是当我从Gradle命令行运行它们时,拦截器似乎什么都不拦截,我从我的API得到了一个真正的响应。

以下是单元测试的代码:

@RunWith(RobolectricGradleTestRunner.class)
@Config(constants = BuildConfig.class, sdk = Build.VERSION_CODES.LOLLIPOP)
public class TestService {

    private API api;

    @Rule
    public ErrorCollector collector = new ErrorCollector();

    @Before
    public void setUp() {
        // Initialize the API with fake data
        api = API.with("fake_client", "fake_secret", "fake_redirect");
    }

    @Test
    public void refreshToken() {
        Response<Token> tokenResponse = api.refreshToken("fake_refresh");
        collector.checkThat("no error", tokenResponse.error, nullValue());
        collector.checkThat("not null", tokenResponse.item, not(nullValue()));

        collector.checkThat("access token", tokenResponse.item.getAccessToken(), is("22fe0c13e995da4a44a63a7ff549badb5d337a42bf80f17424482e35d4cca91a"));
        collector.checkThat("expires at", tokenResponse.item.getExpiresAt(), is(1382962374L));
        collector.checkThat("expires in", tokenResponse.item.getExpiresIn(), is(3600L));
        collector.checkThat("refresh token", tokenResponse.item.getRefreshToken(), is("8eb667707535655f2d9e14fc6491a59f6e06f2e73170761259907d8de186b6a1"));
    }
}

API init的代码(用调用):

private API(@NonNull final String clientId, @NonNull final String clientSecret, @NonNull final String redirectUri) {
    OkHttpClient client = new OkHttpClient.Builder()
            .addInterceptor(new Interceptor() {
                @Override
                public okhttp3.Response intercept(Chain chain) throws IOException {
                    Request original = chain.request();
                    Request.Builder requestBuilder = original.newBuilder()
                            .header("Authorization", "Basic " + Base64.encodeToString((clientId + ":" + clientSecret).getBytes(), Base64.NO_WRAP).replace("\n", ""));
                    Request request = requestBuilder.build();
                    return chain.proceed(request);
                }
            })
            .addInterceptor(new APIInterceptor())
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Important point
            .build();
    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(ROUTE_BASE)
            .client(client)
            .addConverterFactory(GsonConverterFactory.create(new GsonBuilder().create()))
            .build();

    authService = retrofit.create(AuthService.class);
}

最后是API拦截器:

public class APIInterceptor implements Interceptor {

    @Override
    public Response intercept(Chain chain) throws IOException {
        ResponseBody response = ResponseBody.create(MediaType.parse("application/json"), response);
        return new Response.Builder()
            .request(request)
            .addHeader("Content-Type", "application/json")
            .protocol(Protocol.HTTP_1_1)
            .code(200)
            .body(response)
            .build();
    }
}

在我的测试中,但它不起作用。我怎样才能解决这个问题?

我有2种口味;一种味道“生产”,其中类APIInterceptor什么都不做。和一个味道沙盒,其中类APIInterceptor进行模拟。

因此,当我从命令行运行测试时,我使用gradlew:module:testSandboxDebugUnitTest

然后我尝试了一些有趣的东西。如果我获取apinterceptor类(“沙盒”类)的内容,然后将实现直接复制到addInterceptor

API init的代码(用调用):

private API(@NonNull final String clientId, @NonNull final String clientSecret, @NonNull final String redirectUri) {
    OkHttpClient client = new OkHttpClient.Builder()
            .addInterceptor(new Interceptor() {
                @Override
                public okhttp3.Response intercept(Chain chain) throws IOException {
                    Request original = chain.request();
                    Request.Builder requestBuilder = original.newBuilder()
                            .header("Authorization", "Basic " + Base64.encodeToString((clientId + ":" + clientSecret).getBytes(), Base64.NO_WRAP).replace("\n", ""));
                    Request request = requestBuilder.build();
                    return chain.proceed(request);
                }
            })
            .addInterceptor(new Interceptor() {
                // The content of APIInterceptor here
            })
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Important point
            .build();
    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(ROUTE_BASE)
            .client(client)
            .addConverterFactory(GsonConverterFactory.create(new GsonBuilder().create()))
            .build();

    authService = retrofit.create(AuthService.class);
}

这个很好用!

所以问题似乎是Robolectric没有在flavors中使用实现,它似乎只是忽略了flavors中的所有内容。


共有1个答案

裴劲
2023-03-14

好的,多亏了@EugenMartynov,我找到了答案。

事实上,我正在使用另一个模块,这个模块总是一个用于测试的拦截器,但是它在同一个包名称中是相同的类名。

所以当gradle编译的时候,它是在释放模式下使用另一个包的对象,它在不拦截任何东西的情况下进行网络操作!

解决方案是重命名拦截器类!

 类似资料:
  • 我想在android项目中生成JUnit测试的代码覆盖率报告,所以我添加了JaCoCo gradle插件。这是我的项目级文件: 它通过运行<code>工作得很好/gradlew JacoFullReport。但不幸的是,使用<code>RobolectricTestRunner@RunWith注释的测试,或者使用运行的测试报告覆盖率很好。 任何帮助都将不胜感激来解决这个问题。 更新1:我注意到我应

  • 我有以下问题: 我需要一张单人床 我尝试过使用zip运算符,因为这是一种常见的方法,但zip的问题是它会等待来自两个来源的数据——这意味着每次我从Room获得新数据时,zip不会传播任何新的emmision,因为它还需要来自Retrofit的新数据。 我目前的解决方案是这个,使用组合最新: 这是有效的,但有几个小问题。首先,UiModel有多个排放。这是组合最新的预期——我从数据库中获取第一个包含

  • 确实,不太契合,非科班鼠鼠的计网,操作系统基本功太差了,题也没撕。 1. 为何转行 2. 拷打项目 3. 知道哪些网络攻击(csrf,xss) 4. csrf如何防御 5. xss如何开展(嵌入脚本,咋嵌入的?忘了) 6. 你在宿舍ping百度的ip的过程中发生了什么(我真不会) 7. linux如何查看进程监听的tcp端口 8. 如何查看进程PID 9. kill -9 中-9的作用和目的是什么

  • 智元机器人不方便透露的部门前端岗 1. 项目 2. 难点 3. js基本数据类型 4. 对基本数据类型string访问length时发生了什么 5. 事件循环 6. 浏览器实现异步的几种写法 7. react的setState是同步还是异步的 8. 函数组件的基本的hook介绍下 9. redux更新状态的过程 10. 虚拟dom优势,劣势(简单的修改需要很多对比) 11. 算法: 1. 小青蛙上

  • 我正在尝试编写用于修改的单元测试用例,我正在使用它来进行Google Api调用,以从Google令牌中提取细节。请帮助mw模拟这堂课 Tech Stack Springboot(JUnit 4)mockito 我想为这个函数写测试用例这是我的功能 } 这是我用于改装的配置类 @Configuration公共类GmailLoginConfig{

  • 我正在为一个应用程序工作,该应用程序使用警报告诉用户它正在使用nfc。我正在对这个应用程序进行单元测试,并在alertcontroller上设置了一个间谍。创建方法如下: 在单元测试中,我想检查是否使用正确的警报选项调用它,如下所示: 然而,问题是由于处理程序的原因,它在运行测试时给出了错误。我如何有效地测试alertcontroller.create函数是否使用正确的值调用?就像现在一样,测试给