PowerMockito。当期望不按预期工作

发布于 2025-02-05 08:26:21 字数 4085 浏览 7 评论 0原文

我正在尝试测试一个具有私人方法的课程,其中另一个类是实例化的。我正在使用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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文