java - Mockito:仅使用局部变量的测试方法

标签 java unit-testing mockito

我有以下 MyRestService 类方法:

public Address getOfficeLocation(String id){
    RestClient restClient = new RestClient(tokenOauthUrl);
    String url = String.format(officeAddress, id);
    JSONObject jsonObject = restClient.get(url, null, credentials);
    return AddressParser.parseOfficeAddress(jsonObject);
}

我想调用restClient.get。我写了以下测试:

@Mock
private MyRestService myService;
@Mock
private RestClient restClient;

@Test
public void getOfficeLocationTest(){
    myService.getOfficeLocation(any(String.class));
    Mockito.verify(restClient, Mockito.times(1)).get(any(String.class), any(MultivaluedMap.class), any(Credentials.class));
}

我认为这是完全错误的做法。我测试失败:想要但未调用:实际上,与此模拟的交互为零。

如何使我的方法可测试?

最佳答案

你的 SUT 应该是这样的

class YourClass {
    @Inject
    private RestClient restClient;    //Injecting RestClient

    public Address getOfficeLocation(String id){
        String url = String.format(officeAddress, id);
        JSONObject jsonObject = restClient.get(url, null, credentials);
        return AddressParser.parseOfficeAddress(jsonObject);
    }
}

你的测试代码有

@Mock
private MyRestService myService;

我相信 MyRestService 是您的待测系统(SUT),因此不应模拟它,而必须创建它的新对象

也许是这样的

@InjectMocks
private MyRestService myService;

这会将模拟的 RestClient 注入(inject)到 MyRestService

关于java - Mockito:仅使用局部变量的测试方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40997163/

相关文章:

java - 单元测试 Spring Cloud Gateway RouteLocator customRouteLocator(RouteLocatorBuilder routeLocatorBuilder)

java - 测试返回类型为 void 的方法

java - 如何在 Java 中读取 .zip 文件中的文件?

java - 在 Eclipse 中创建类似于 Spring Petclinic 的项目结构

unit-testing - Ionic 2 NavController 单元测试

java - Mockito.lenient 未返回预期结果

java - Junit5中如何检查嵌套对象是否相等

java - 将 SQLite DB 的一列获取到 ListView 在 Android 中不起作用

java - Java 中 false boolean 值后重新启动 While 循环

python - Patch - 修补类引入了一个额外的参数?