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

如何测试多个服务调用

洪建茗
2023-03-14

我正在努力增加我在Android上的代码覆盖率。但我找不到测试这个演示者的正确方法。onSelectContact会进行一个服务调用,随后my ServiceFactory.GetContactService会进行另一个调用。我怎么能嘲笑这些电话呢?

public class ContactListPresenter {

    public void onSelectContact(User user) {
        getCorrespondingContactCall(user).enqueue(new Callback <JsonElement>() {
            @Override
            public void onResponse(Call<JsonElement> call, Response<JsonElement> response) {
                switch (response.code()) {
                    case case1:
                        goToFirstActivity(user, response);
                        break;
                    case case2:
                        goToSecondActivity(user, response);
                        break;
                    default: showInvalidInput(user);
                        break;
                }
            }

            @Override
            public void onFailure(Call<JsonElement> call, Throwable throwable) {
                if (getView() != null) {
                    getView().showErrorView();
                }
            }
        });
    }

    protected Call<JsonElement> getCorrespondingContactCall(final User user) {
        return StringUtils.isValidEmail(user.getEmail())
                ? ServiceFactory.getContactService().checkContactByEmail(user.getEmail())
                : ServiceFactory.getContactService().checkContactByPhoneNumber(user.getPhoneNumber());
    }     

}

共有1个答案

何安宜
2023-03-14

如果可以-消除静态调用。例如,通过将ContactService显式注入到测试中的类:

public class ContactListPresenter {
    private final ContactService contactService;

    public ContactListPresenter(ContactService contactService) {
        this.contactService = contactService;
    }

    // rest of the code

    protected Call<JsonElement> getCorrespondingContactCall(final User user) {
        return StringUtils.isValidEmail(user.getEmail())
                ? contactService.checkContactByEmail(user.getEmail())
                : contactService.checkContactByPhoneNumber(user.getPhoneNumber());
    }     
}

这样,在测试中,您就可以轻松地模拟调用 (调用ContactService时返回的 <jsonelement> )。

但是,如果更改代码不是一个选项,则可以使用其他选项:

>

  • 使用Powermock模拟静态调用

    通过在测试中创建匿名子类并存根调用GetRecordingContactCall的结果,利用GetRecordingContactCall具有Protected访问权这一事实。例如:

    public class ContactListPresenterTest {
       @Test
       public void test() {
          User user = ... // create user for test
          ContactListPresenter presenter = new ContactListPresenter() {
             @Override
             Call<JsonElement> getCorrespondingContactCall(final User user) {
                return ... // stub result of the call
             }
          };
          presenter.onSelectContact(user);
          // assert expected behavior
       }
    
    }
    

  •  类似资料:
    • 我在Scala上使用Play 2.5,我创建了一个类,可以多次调用外部web服务。 外部Web服务在某些条件下被调用并得到ok或nok的简单响应。如果可以,那么我应该更新内部对象状态,如果可以,我现在什么也不做。 这是我的类,它将String的列表作为参数,并返回要在控制器中处理的对象的Future列表。 是列表类型的列表,但我希望它只是一个简单的响应列表。 1)如何简化和纠正我的代码以获得响应列

    • 下面是一个helper函数的代码 基本上,此方法只需使用HttpRequest和HttpResponse调用endpointURL,endpointURL是web服务,在参数中指定的超时之后,它将只返回200。 现在的问题是,我需要编写一个测试用例来涵盖这个方法,但我不知道如何编写它。。我不知道如何正确模拟httpcallout,因为此方法不返回HttpResponse,而且由于代码现在已冻结,我

    • 像组件一样,服务通常需要依赖,Angular通过服务类的构造函数注入。由于我们在Angular的引导过程之外初始化这些类,我们必须自己显式注入这些依赖。这是通过使用TestBed配置测试模块传回所需的依赖项(如HTTP模块)来实现的。

    • 问题内容: 我对Java单元测试非常陌生,听说Mockito框架对于测试非常有用。 我已经开发了一个REST Server(CRUD方法),现在我想对其进行测试,但是我不知道如何? 我什至不知道该测试程序应该如何开始。我的服务器应该在本地主机上运行,​​然后在该URL上进行调用(例如,本地主机:8888)? 这是我到目前为止尝试过的方法,但是我很确定这不是正确的方法。 这是方法的代码。 在此测试用

    • 问题内容: 我只想在不引导Angular的情况下测试服务。 我看了一些例子和教程,但是我什么也不会去。 我只有三个文件: myService.js:在这里定义AngularJS服务 test_myService.js:在这里定义服务的Jasmine测试。 specRunner.html:一个具有常规茉莉花配置的HTML文件,在其中导入了前两个其他文件以及茉莉花,Angularjs和angular-

    • 我有一个服务器,用Java编写的,那是我的应用程序,我想在上面运行一些测试。我正在使用gradle来管理依赖项和构建任务等,所以我也想在这方面使用它。我需要启动服务器,然后运行我的单元测试,这会对它发出一堆HTTP请求,然后在测试完成后,理想情况下甚至关闭服务器。所以我尝试在build.gradle中添加(jettyRunWar是运行服务器的工具),但我想这太简单了,因为从不从jettyRunWa