PowerMock, simula un método estático, LUEGO llama a métodos reales en todas las demás estáticas


Estoy configurando métodos estáticos de burla de una clase. Tengo que hacer esto en un método de configuración JUnit anotado @Before.

Mi objetivo es configurar la clase para llamar a métodos reales, excepto para aquellos métodos que me mofo explícitamente.

Básicamente:

@Before
public void setupStaticUtil() {
  PowerMockito.mockStatic(StaticUtilClass.class);

  when(StaticUtilClass.someStaticMethod(antString())).thenReturn(5); // mock out certain methods...

  // Now have all OTHER methods call the real implmentation???  How do I do this?
}

El problema que estoy encontrando es que dentro de StaticUtilClass el método public static int someStaticMethod(String s) desafortunadamente arroja un RuntimeException si se suministra con un valor null.

Así que no puedo simplemente ir por la ruta obvia de llamar a los métodos reales como el valor predeterminado respuesta de la siguiente manera:

@Before
public void setupStaticUtil() {
  PowerMockito.mockStatic(StaticUtilClass.class, CALLS_REAL_METHODS); // Default to calling real static methods

  // The below call to someStaticMethod() will throw a RuntimeException, as the arg is null!
  // Even though I don't actually want to call the method, I just want to setup a mock result
  when(StaticUtilClass.someStaticMethod(antString())).thenReturn(5); 
}

Necesito establecer la respuesta predeterminada para llamar a métodos reales en todos los demás métodos estáticos después de Me burlo de los resultados del método que me interesa burlar.

Es esto posible?

Author: Tom Tresansky, 2013-02-01

1 answers

Lo que estás buscando se llama burla parcial.

En PowerMock puede usar el método mockStaticPartial.

En PowerMockito se puede utilizar stubbing, que solo se stub el método definido y dejar otro sin cambios:

PowerMockito.stub(PowerMockito.method(StaticUtilClass.class, "someStaticMethod")).toReturn(5);

También no se olvide de la

@PrepareForTest(StaticUtilClass.class)
 52
Author: zibi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-02-01 18:19:47