2013-07-30 12 views
5

sto cercando di verificare che il metodo Collections.shuffle() è stato chiamato in una delle mie classi. Ho letto la (piccola) documentazione su PowerMock con Mockito e ho letto le altre domande su SO che trattavano questo problema e non ottenevo una soluzione.beffardo statico con PowerMock e Mockito non funziona

@RunWith(PowerMockRunner.class) 
@PrepareForTest(Collections.class) 
public class MyTest { 

    @Test 
    public void testShuffle() { 
     PowerMockito.mockStatic(Collections.class); 
     PowerMockito.doCallRealMethod().when(Collections.class); 
     Collections.shuffle(Mockito.anyListOf(Something.class)); 

     ClassToTest test = new ClassToTest(); 
     test.doSomething(); 

     PowerMockito.verifyStatic(); // Verify shuffle was called exactly once 
     Collections.shuffle(Mockito.anyListOf(Something.class)); 
    } 
} 

public class ClassToTest { 
    private final List<Something> list; 
    // ... 
    public void doSomething() { 
     Collections.shuffle(list); 
     // do more stuff 
    } 
} 

Dato il codice di cui sopra, mi aspetto il passaggio di test unitario. Tuttavia, il test dell'unità non riesce come segue:

Wanted but not invoked java.util.Collections.shuffle([]); 
Actually, there were zero interactions with this mock. 

Cosa sto facendo male?

Grazie

EDIT: Come per il suggerimento di seguito ho provato quanto segue e ottengo lo stesso errore.

@RunWith(PowerMockRunner.class) 
@PrepareForTest(Collections.class) 
public class MyTest { 

    @Test 
    public void testShuffle() { 
     PowerMockito.mockStatic(Collections.class); 

     ClassToTest test = new ClassToTest(); 
     test.doSomething(); 

     PowerMockito.verifyStatic(); // Verify shuffle was called exactly once 
     Collections.shuffle(Mockito.anyListOf(Something.class)); 
    } 
} 
+0

Cosa succede se si allentare le restrizioni sulla matcher da '' anyListOf' a qualsiasi (List.class) '? Cosa succede se aggiungete 'ClassToTest' all'annotazione' @ PrepareForTest'? –

risposta

4

È possibile finto/verificare il metodo java.util.Collections.shuffle ([]) o chiamare l'attuazione reale (con PowerMockito.doCallRealMethod()). Ma non puoi fare entrambe le cose.

Se si rimuove

PowerMockito.doCallRealMethod().when(Collections.class); 

la chiamata sarà verificato e il test passerà.

https://powermock.googlecode.com/svn/docs/powermock-1.4.7/apidocs/org/powermock/api/mockito/PowerMockito.html#doCallRealMethod%28%29

Questo codice funziona per me:

package test; 

import java.util.Collections; 
import java.util.LinkedList; 
import java.util.List; 

import org.junit.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; 

@RunWith(PowerMockRunner.class) 
@PrepareForTest(Collections.class) 
public class MyTest { 

    @Test 
    public void testShuffle() { 
     PowerMockito.mockStatic(Collections.class); 
/*  PowerMockito.doCallRealMethod().when(Collections.class); remove this line */ 
     Collections.shuffle(Mockito.anyListOf(Something.class)); 

     ClassToTest test = new ClassToTest(); 
     test.doSomething(); 

     PowerMockito.verifyStatic(); // Verify shuffle was called exactly once 
     Collections.shuffle(Mockito.anyListOf(Something.class)); 
    } 
} 

class ClassToTest { 
    private List<Something> list = new LinkedList<Something>(); 
    // ... 
    public void doSomething() { 
     Collections.shuffle(list); 
     // do more stuff 
    } 
} 
class Something { 
} 
+0

Ho provato quello che mi hai suggerito, e il mio test fallisce ancora dicendo che non ci sono state interazioni pari a zero. Vedi la mia modifica. –

+0

Ah grazie ... Ho perso la parte in cui devo chiamare Collections.shuffle() ... Anche se avrei giurato di averlo provato anch'io. –

4

Questa è una domanda un po 'vecchia, ma mi piace ancora di chiarire che la risposta accettata è di fatto errata. Eseguendo il seguente codice,

PowerMockito.mockStatic(Collections.class); 
Collections.shuffle(Mockito.anyListOf(Something.class)); 

tutti verifica passeranno sempre e comunque in seguito:

PowerMockito.verifyStatic(); // Verify shuffle was called exactly once 
Collections.shuffle(Mockito.anyListOf(Something.class)); 

anche se non si chiama test.doSomething(); il test previsto nella risposta sarà ancora passare. Il modo corretto per verificare ciò è verificare effettivamente se gli elementi nell'elenco sono stati ordinati correttamente.

Problemi correlati