2012-09-14 56 views
6
public class TestStatic { 
    public static int methodstatic(){ 
     return 3; 
    } 
} 


@Test 
@PrepareForTest({TestStatic.class}) 
public class TestStaticTest extends PowerMockTestCase { 

    public void testMethodstatic() throws Exception { 
     PowerMockito.mock(TestStatic.class); 
     Mockito.when(TestStatic.methodstatic()).thenReturn(5); 
     PowerMockito.verifyStatic(); 
     assertThat("dff",TestStatic.methodstatic()==5); 
    } 

    @ObjectFactory 
    public IObjectFactory getObjectFactory() { 
     return new org.powermock.modules.testng.PowerMockObjectFactory(); 
    } 
} 

La excepción:PowerMock clase estática no se burlan

org.mockito.exceptions.misusing.MissingMethodInvocationException: 
when() requires an argument which has to be 'a method call on a mock'. 
For example: 
    when(mock.getArticles()).thenReturn(articles); 

Also, this error might show up because: 
1. you stub either of: final/private/equals()/hashCode() methods. 
Those methods *cannot* be stubbed/verified. 
2. inside when() you don't call method on mock but on some other object. 

estoy corriendo a través de IntelliJ, el código de la herencia tiene un montón de métodos ...

Alguien tiene idea y fui a través de la tuto oficial, ningún medio para hacer esta sencilla prueba de trabajo

Respuesta

0

Echa un vistazo a esta respuesta: Mocking Logger and LoggerFactory with PowerMock and Mockito

Además, no debe usar Mockito.when si desea conectar llamadas estáticas, pero PowerMockito.when.

Las estadísticas son una pesadilla de la capacidad de prueba, evite eso tanto como sea posible, y reelabore su diseño para no usar estadísticas más o para no tener que usar trucos de PowerMock para poder probar su código de producción.

Espero que ayude.

Saludos, Brice

+0

Gracias, sí, no eliges el código heredado :), pero puedes refactorizar ... hacer una simulación estática y aplicar un patrón simulable. – Sam

+0

El código legado acordado es un problema, PowerMock es realmente poderoso en estos casos :) – Brice

+1

Esto simplemente no es cierto: "Además, no debe usar' Mockito.when' si quiere colgar llamadas estáticas ". La página de uso de PowerMockito usa 'Mockito.when' en su código de ejemplo. – ach

3

Me tomó un vistazo a mis pruebas de código heredado y lo que veo es que llame PowerMockito.mock(TestStatic.class) en lugar de PowerMockito.mockStatic(TestStatic.class). No importa si usa PowerMockito.when(...) o Mockito.when(...), porque el primero simplemente delega en el segundo.

Una observación más: entiendo que tal vez deba probar un código heredado. Tal vez podrías hacer eso en estilo JUnit4, ¿no solo para producir pruebas heredadas? El ejemplo mencionado por Brice es bueno.

5

he encontrado la solución para tal problema en mi caso, quiero compartirlo con ustedes:

Si llamara el método objeto de burla en la clase de prueba:

@RunWith(PowerMockRunner.class) 
@PrepareForTest(Calendar.class) 
public class TestClass { 
    @Test 
    public void testGetDefaultDeploymentTime() 
    PowerMockito.mockStatic(Calendar.class); 
    Calendar calendar = new GregorianCalendar(); 
    calendar.set(Calendar.HOUR_OF_DAY, 8); 
    calendar.set(Calendar.MINUTE, 0); 
    when(Calendar.getInstance()).thenReturn(calendar); 
    Calendar.getInstance(); 
    } 
} 

ha funcionado bien. Pero cuando volví a escribir la prueba, llamó a Calendar.getInstance() en otra clase y usó el método real de Calendar.

@Test 
public void testGetDefaultDeploymentTime() throws Exception { 
    mockUserBehaviour(); 
    new AnotherClass().anotherClassMethodCall(); // Calendar.getInstance is called here 
} 

Por lo tanto, como una solución que añade AnotherClass.class a @PrepareForTest y funciona ahora.

@PrepareForTest({Calendar.class, AnotherClass.class}) 

Parece que PowerMock necesita saber dónde se llamará el método estático falso.

+0

Esto no parece un método estático; sin embargo, estás llamando a los métodos del objeto hasta donde yo puedo ver. –

Cuestiones relacionadas