No se puede simulacro de campo anotados utilizando Mockito

Nishant Ingle:

A continuación se presenta el sujeto bajo prueba 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;
    }
}

Y ésta es la prueba 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);
    }
}

Cuando ejecuto la prueba, a ser posible, ya que llega a la segunda línea de la RestClient.java isEnabled método, la salida debe ser burlado como se indica en primera línea de @Before sino que trata de llamar al método real, dando lugar a IllegalArgumentException .

¿Puede alguien por favor dígame cómo puedo adecuadamente burlarse de esa llamada sin hacer ningún cambio en el archivo RestClient.java ?

segundo :

Editar: Actualización

Tengo problema en la línea AboutApi aboutApi = new AboutApi (getApiClient ()). Aquí se está llamando a una nueva instancia en lugar de utilizar la que me burlé. Quiero saber cómo puedo insertar la instancia burlado de AboutApi sin tocarse RestClient.java

En ese caso hay que echar un vistazo a la funcionalidad de whenNew PowerMockito.

Usted tendrá que añadir la @PrepareForTestanotación para que incluya la clase que se ha de modificar, en su caso RestClient.

@RunWith(PowerMockRunner.class)
@PrepareForTest(RestClient.class)

No está seguro de si esto es un error tipográfico en su pregunta, pero el método es necesario definir el comportamiento de debe ser getMultiSiteServiceInfoen lugar de getServiceInfo.

@Test
public void testIsEnabled() throws Exception {

    Mockito.when(aboutApiClient.getMultiSiteServiceInfo()).thenReturn(serviceInfo);
    Mockito.when(serviceInfo.getStatus()).thenReturn("ACTIVE");

    PowerMockito.whenNew(AboutApi.class)
                .withAnyArguments()
                .thenReturn(aboutApiClient);

    boolean status = restClient.isEnabled();
    Assert.assertTrue(status);
}

Se puede reemplazar withAnyArguments()con withArguments(Mockito.any(ApiClient.class))si desea ser más específico.

Tenga en cuenta sin embargo, que los campos tokenServicey baseUrlen su RestClientclase será null.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=365625&siteId=1
Recomendado
Clasificación