【问题标题】:Mock an object which is not injected模拟未注入的对象
【发布时间】:2021-06-07 03:41:20
【问题描述】:

我是 Java 编程新手,我有以下代码:

import javax.ws.rs.client.ClientBuilder;

public class Foo {
    private final Client http;
    Foo() {
        http = ClientBuilder.newClient().register(CurlRequestFactory.getCurlRequestFactory().get(LOGGER, “someString”));
    }

    public someMethod() {
        Invocation.Builder request = http.target(getURI(“someUri”)).request().header(“someHeader”, “someValue”);
        Response response = request.get();
    }
}

我想为someMethod() 编写一个单元测试,其中request.get() 会抛出异常。为此,我要求将 request 对象设置为模拟对象。 但我无法这样做,因为它是直接初始化而不是被注入。

我知道我可以模拟一个对象,如果它被注入如下:

Response responseMock = Mockito.mock(Response.class);
Mockito.when(responseMock.get()).thenThrow(new Exception("someMessage"));

但我找不到适合我的场景的任何东西。

PS:我不想使用 Powermock。

【问题讨论】:

    标签: java unit-testing mocking mockito


    【解决方案1】:

    我遇到了一些 Mokito 不支持的事情。一种是这种情况。您必须更改代码以注入它或使用PowerMockito。我认为没有其他选择。

    【讨论】:

      【解决方案2】:

      你的方法可能做的事情太多了。我想您不想只从 someMethod 返回响应。将您的代码重构为 someMethod(Response response) 甚至更好的 someMethod(Pojo responseBody),然后对其进行测试。

      我不知道您的用例是什么,但 someMethod 可能属于与 http 客户端类 (Foo) 分开的另一个类(我称之为 Bar)。然后,您可以将 Foo 注入 Bar 并进行测试。你有什么理由不想重构吗?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-03-16
        • 2017-10-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-08
        相关资源
        最近更新 更多