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 ?
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 @PrepareForTest
anotació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 getMultiSiteServiceInfo
en 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 tokenService
y baseUrl
en su RestClient
clase será null
.