PowerMockito。当期望不按预期工作
我正在尝试测试一个具有私人方法的课程,其中另一个类是实例化的。我正在使用PowerMockito通过使用模拟的方法提供模拟对象来模拟实例。问题在于,无论我尝试什么,无论如何都会调用真实的类构造函数,而没有提供模拟。
我正在测试的方法是Accionpsd2类的一部分,看起来像这样:
private void enviarSolicitudPSD2(MultipleService multipleService) throws Exception{
log.info("INICIO enviarSolicitudPSD2");
String user = Configuracion.configuracionesBBDD.get("microservicio.jazztel.API.usuario");
log.debug("API user = " + user);
String pass = Configuracion.configuracionesBBDD.get("microservicio.jazztel.API.pass");
log.debug("API pass = " + pass);
String url = Configuracion.configuracionesBBDD.get("microservicio.jazztel.API.url");
log.debug("API url = " + url);
String timeout = Configuracion.configuracionesBBDD.get("microservicio.jazztel.API.timeout");
log.debug("Timeout = " + timeout);
ApiPSD2Jazztel apiPSD2Jazztel = new ApiPSD2Jazztel(url, user, pass);
apiPSD2Jazztel.init();
responseMultipleActivation = apiPSD2Jazztel.enviaSolicitudPSD2(multipleService, "jazztel");
log.info("Fin enviarSolicitudPSD2");
}
我正在使用的测试类是:
package com.hpe.coco.frontend.micros.acciones.model.workflow;
import com.hpe.coco.frontend.micros.acciones.service.psd2.ApiPSD2Jazztel;
import com.hpe.coco.frontend.micros.acciones.service.psd2.ws.MultipleService;
import com.hpe.coco.frontend.micros.acciones.service.psd2.ws.ResponseMultipleActivation;
import com.hpe.coco.frontend.micros.util.Configuracion;
import lombok.SneakyThrows;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.mockito.Mockito;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import org.powermock.reflect.Whitebox;
import java.util.HashMap;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.powermock.api.mockito.PowerMockito.*;
@RunWith(PowerMockRunner.class)
@PrepareForTest(AccionPSD2.class)
public class AccionPSD2Test {
private AccionPSD2 instance;
private final String mockString = "testString";
@BeforeEach
public void init() {
instance = new AccionPSD2();
}
@SneakyThrows
@Test
public void testEnviarSolicitudPSD2() {
ApiPSD2Jazztel mockApiPSD2Jazztel = PowerMockito.mock(ApiPSD2Jazztel.class);
PowerMockito.whenNew(ApiPSD2Jazztel.class).withAnyArguments().thenReturn(mockApiPSD2Jazztel);
ResponseMultipleActivation mockResponse = new ResponseMultipleActivation();
doNothing().when(mockApiPSD2Jazztel).init();
Mockito.when(mockApiPSD2Jazztel.enviaSolicitudPSD2(any(), anyString())).thenReturn(mockResponse);
Configuracion.configuracionesBBDD = new HashMap<>();
Configuracion.configuracionesBBDD.put("microservicio.jazztel.API.usuario", mockString);
Configuracion.configuracionesBBDD.put("microservicio.jazztel.API.pass", mockString);
Configuracion.configuracionesBBDD.put("microservicio.jazztel.API.url", mockString);
Configuracion.configuracionesBBDD.put("microservicio.jazztel.API.timeout", mockString);
MultipleService mockInput = new MultipleService();
Whitebox.invokeMethod(instance, "enviarSolicitudPSD2", mockInput);
PowerMockito.verifyNew(ApiPSD2Jazztel.class).withArguments(mockString, mockString, mockString);
verify(mockApiPSD2Jazztel, times(1)).enviaSolicitudPSD2(mockInput, "jazztel");
Assertions.assertEquals(mockResponse, instance.responseMultipleActivation);
}
}
即使我用正确的注释给了测试类注释,以便为了使New何时工作,但它仍然无法正常工作。该方法是私人的事实,我正在使用反射来调用它吗?还是我还应该尝试什么? 感谢您的帮助!
I am trying to test a class having a private method inside which another class is instantiated. I am using PowerMockito to mock the instantiation by providing a mocked object with mocked methods. The problem is that whatever I try, the real class constructor is invoked anyway and the mock is not provided instead.
The method I am testing is part of the AccionPSD2 class and looks like this:
private void enviarSolicitudPSD2(MultipleService multipleService) throws Exception{
log.info("INICIO enviarSolicitudPSD2");
String user = Configuracion.configuracionesBBDD.get("microservicio.jazztel.API.usuario");
log.debug("API user = " + user);
String pass = Configuracion.configuracionesBBDD.get("microservicio.jazztel.API.pass");
log.debug("API pass = " + pass);
String url = Configuracion.configuracionesBBDD.get("microservicio.jazztel.API.url");
log.debug("API url = " + url);
String timeout = Configuracion.configuracionesBBDD.get("microservicio.jazztel.API.timeout");
log.debug("Timeout = " + timeout);
ApiPSD2Jazztel apiPSD2Jazztel = new ApiPSD2Jazztel(url, user, pass);
apiPSD2Jazztel.init();
responseMultipleActivation = apiPSD2Jazztel.enviaSolicitudPSD2(multipleService, "jazztel");
log.info("Fin enviarSolicitudPSD2");
}
The test class I am using is the following:
package com.hpe.coco.frontend.micros.acciones.model.workflow;
import com.hpe.coco.frontend.micros.acciones.service.psd2.ApiPSD2Jazztel;
import com.hpe.coco.frontend.micros.acciones.service.psd2.ws.MultipleService;
import com.hpe.coco.frontend.micros.acciones.service.psd2.ws.ResponseMultipleActivation;
import com.hpe.coco.frontend.micros.util.Configuracion;
import lombok.SneakyThrows;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.mockito.Mockito;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import org.powermock.reflect.Whitebox;
import java.util.HashMap;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.powermock.api.mockito.PowerMockito.*;
@RunWith(PowerMockRunner.class)
@PrepareForTest(AccionPSD2.class)
public class AccionPSD2Test {
private AccionPSD2 instance;
private final String mockString = "testString";
@BeforeEach
public void init() {
instance = new AccionPSD2();
}
@SneakyThrows
@Test
public void testEnviarSolicitudPSD2() {
ApiPSD2Jazztel mockApiPSD2Jazztel = PowerMockito.mock(ApiPSD2Jazztel.class);
PowerMockito.whenNew(ApiPSD2Jazztel.class).withAnyArguments().thenReturn(mockApiPSD2Jazztel);
ResponseMultipleActivation mockResponse = new ResponseMultipleActivation();
doNothing().when(mockApiPSD2Jazztel).init();
Mockito.when(mockApiPSD2Jazztel.enviaSolicitudPSD2(any(), anyString())).thenReturn(mockResponse);
Configuracion.configuracionesBBDD = new HashMap<>();
Configuracion.configuracionesBBDD.put("microservicio.jazztel.API.usuario", mockString);
Configuracion.configuracionesBBDD.put("microservicio.jazztel.API.pass", mockString);
Configuracion.configuracionesBBDD.put("microservicio.jazztel.API.url", mockString);
Configuracion.configuracionesBBDD.put("microservicio.jazztel.API.timeout", mockString);
MultipleService mockInput = new MultipleService();
Whitebox.invokeMethod(instance, "enviarSolicitudPSD2", mockInput);
PowerMockito.verifyNew(ApiPSD2Jazztel.class).withArguments(mockString, mockString, mockString);
verify(mockApiPSD2Jazztel, times(1)).enviaSolicitudPSD2(mockInput, "jazztel");
Assertions.assertEquals(mockResponse, instance.responseMultipleActivation);
}
}
Even though I annotated the test class with the correct annotations in order for whenNew to work, it still does not work correctly. Is there a problem with the fact that the method is private and I am using reflection to invoke it? Or what else should I try?
Thank you for your help!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论