无法使用Mockito模拟带注释的字段

问题描述 投票:0回答:1

以下为正在测试的主题RestClient.java

package com.demo.mockito;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.Validate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import com.demo.sample1.RestClient;
import com.demo.sample2.AboutApi;
import com.demo.sample3.ServiceInfo;
import com.demo.sample4.FeatureRepo;

@Component
@Slf4j
public class RestClient {

    @Value("${test.api.baseURL:http://localhost:80}")
    private String baseURL;

    private static String ACTIVE = "ACTIVE";

    @Autowired(required = false)
    private TokenService tokenService;

    private FeatureRepo featureRepo;

    RestClient(FeatureRepo featureRepo) {
        this.FeatureRepo = featureRepo;
    }

    public boolean isEnabled() {
        AboutApi aboutApi = new AboutApi(getApiClient());
        ServiceInfo serviceInfo = aboutApi.getMultiSiteServiceInfo();
        Validate.notNull(serviceInfo);
        return ACTIVE.equals(serviceInfo.getStatus());
    }

    private ApiClient getApiClient() {
        ApiClient apiClient = new ApiClient();
        apiClient.setBasePath(baseURL);
        return apiClient;
    }
}

这是测试RestClientTest.java

package com.demo.mockito;

import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.when;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.powermock.modules.junit4.PowerMockRunner;
import com.demo.sample1.RestClient;
import com.demo.sample2.AboutApi;
import com.demo.sample3.ServiceInfo;
import com.demo.sample4.FeatureRepo;


@RunWith(PowerMockRunner.class)
public class RestClientTest {
    @InjectMocks private RestClient restClient;

    @Mock private AboutApi aboutApiClient;

    @Mock ServiceInfo serviceInfo;

    @Mock FeatureRepo featureRepo;

    @Before
    public void init() throws ApiException {
        when(aboutApiClient.getServiceInfo()).thenReturn(serviceInfo);
        when(serviceInfo.getStatus()).thenReturn("ACTIVE");
    }

    @Test
    public void testIsEnabled() throws ApiException {
        boolean status = restClient.isEnabled();
        assertTrue(status);
    }
}

当我运行测试时,理想情况下,当它到达RestClient.java的isEnabled方法的第二行时,应按@@ Before的第一行中所述模拟输出,但它会尝试调用真实的导致IllegalArgumentException的方法。

有人可以告诉我如何在不对文件RestClient.java进行任何更改的情况下正确模拟该调用吗?

java spring junit mockito powermockito
1个回答
0
投票

检查docu是否为InjectMocks。您只能使用一种注入类型,因此使用args构造函数时,它需要包含您要模拟的所有依赖关系。

推荐的方法是使用构造函数注入。


或者,您可以自己创建对象并使用Reflections手动注入模拟。

© www.soinside.com 2019 - 2024. All rights reserved.