es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

PowerMockito para burlarse de un método estático dentro de una clase usando MockitoJUnitRunner

Quiero utilizar PowerMockito dentro de una clase de prueba que tiene la anotación @RunWith(MockitoJUnitRunner.class). Realizo la siguiente simulación de método estático:

BeanLocator mockBeanLocator = mock(BeanLocator.class);
PowerMockito.mockStatic(PortalBeanLocatorUtil.class);
PowerMockito.when(PortalBeanLocatorUtil.getBeanLocator()).thenReturn(mockBeanLocator);

La última línea no funciona. Recibo este mensaje de error:

org.mockito.exceptions.misusing.MissingMethodInvocationException: 

when() requiere un argumento que tiene que ser ‘una llamada a método en un mock’.
Por ejemplo:
when(mock.getArticles()).thenReturn(articles);

Además, este error puede aparecer porque:
1. estás haciendo stubbing de métodos final/private/equals()/hashCode().
Esos métodos no se pueden stubbing/verified.
2. dentro de when() no estás llamando al método en el mock sino en algún otro objeto.
3. el padre de la clase fue simulada no es pública.
Es una limitación del engine de simulación.

PortalBeanLocatorUtil es una clase pública con la función estática pública BeanLocator getBeanLocator(). Todas estas clases son de una biblioteca de terceros. ¿Cuál es la forma adecuada de simular el método estático getBeanLocator()?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Puede utilizar PowerMockito.mockStatic(PortalBeanLocatorUtil.class) de PowerMockito para simular el método estático getBeanLocator() y después utilizar PowerMockito.when(PortalBeanLocatorUtil.getBeanLocator()).thenReturn(mockBeanLocator) para especificar el valor que devolverá el método.

    Si aún así aparece el error, asegúrese de que la clase padre de PortalBeanLocatorUtil sea pública y de que esté llamando al método en el objeto simulado y no en otro objeto.

Comments are closed.