首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何模拟Unirest链接方法?

如何模拟Unirest链接方法?
EN

Stack Overflow用户
提问于 2019-01-31 12:00:28
回答 2查看 1.5K关注 0票数 0

我有这样一个类,它使用Unirest API进行HTTP POST调用-

代码语言:javascript
复制
public class MyClass{
    public MyObject getData(){
    HttpResponse response = Unirest.post(someURL).header("Content-Type", "application/x-www-form-urlencoded")
                        .field("Field1", context.getParameter("value for field 1"))
                        .field("username", context.getParameter("username"))
                        .field("password", context.getParameter("password"))
                        .field("field 3", context.getParameter("field 3 value"))
                        .field("field 4", context.getParameter("field 4 value"))
                        .asJson();
    }
    }

在模拟类中-在调用Unirest时,mockito中有一个HttpResponse对象要返回。我不想通过Unirest到达端点,并且希望返回我的自定义httpResponse。

代码语言:javascript
复制
HttpResonse<JsonNode> httpResponse; // my mocked response
Mockito.when(Unirest.post(someURL).header("Content-Type", "application/x-www-form-urlencoded")
                            .field("Field1", context.getParameter("value for field 1"))
                            .field("username", context.getParameter("username"))
                            .field("password", context.getParameter("password"))
                            .field("field 3", context.getParameter("field 3 value"))
                            .field("field 4", context.getParameter("field 4 value"))
                            .asJson()).thenReturn(httpResponse); // this is my custom response

我已经对所有params的上下文进行了嘲弄,但是仍然会出现错误。

org.mockito.exceptions.misusing.WrongTypeOfReturnValue: HttpResponse不能由getParameter()返回 getParameter()应该返回字符串

是否有一种方法可以更容易地对第三方链接方法进行模拟,或者为实现提供更好的示例?谢谢!

EN

回答 2

Stack Overflow用户

发布于 2019-01-31 12:27:57

如果允许重构代码,最简单的方法是提取对受保护方法的静态调用:

代码语言:javascript
复制
public class MyClass{
    public MyObject getData(){
      HttpResponse response = postRequest();
    }

    protected HttpResponse postRequest(){
       return Unirest.post(someURL).header("Content-Type", "application/x-www-form-urlencoded")
                        .field("Field1", context.getParameter("value for field 1"))
                        .field("username", context.getParameter("username"))
                        .field("password", context.getParameter("password"))
                        .field("field 3", context.getParameter("field 3 value"))
                        .field("field 4", context.getParameter("field 4 value"))
                        .asJson();
    }
}

然后在您的测试用例中,监视被测试的类并模拟受保护的方法:

代码语言:javascript
复制
public void test(){
   MyClass myClass = Mockito.spy(new MyClass());

   HttpResonse<JsonNode> httpResponse; // my mocked response

   doReturn(httpResponse).when(myClass).postRequest();

   ...
}
票数 1
EN

Stack Overflow用户

发布于 2020-02-13 19:54:25

我通过分别模拟每个多部分请求来摆脱NPE。例如:

代码语言:javascript
复制
@PrepareForTest({ Unirest.class})
public TestClass {
    @Mock
    private HttpRequestWithBody httpRequestWithBody;

@Test
public void testMethod() {
.
.
.
 httpRequestWithBody = Mockito.mock(HttpRequestWithBody.class);
        MultipartBody multipartUsernameBody = Mockito.mock(MultipartBody.class);
        Mockito.when(httpRequestWithBody.field("username", "username@userdomain.com")).thenReturn(multipartUsernameBody);

        MultipartBody multipartPasswordBody = Mockito.mock(MultipartBody.class);
        Mockito.when(multipartUsernameBody.field("password", "Password123")).thenReturn(multipartPasswordBody);
.
.
.
}

此外,您还必须在实际代码中相应地拆分请求。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54460130

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档