2013-07-30 11 views
5

Próbuję sprawdzić, czy metoda Collections.shuffle() została wywołana w jednej z moich klas. Przeczytałem (małą) dokumentację na PowerMock z Mockito i przeczytałem inne pytania SO, które dotyczyły tego problemu i nie otrzymałem rozwiązania.Statyczne kpiny z PowerMock i Mockito nie działają

@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 
    } 
} 

Biorąc pod uwagę powyższy kod, oczekuję pozytywnego wyniku testu jednostkowego. Jednak test urządzenia kończy się następująco:

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

Co robię źle?

Dzięki

EDIT: Zgodnie z sugestią poniżej Próbowałem następujących, i uzyskać ten sam błąd.

@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

Co stanie się, jeśli zwolnisz ograniczenie swojego matchera z 'anyListOf' na' any (List.class) '? Co się stanie, jeśli dodasz "ClassToTest" do adnotacji '@ PrepareForTest'? –

Odpowiedz

4

Można mock/zweryfikować metodę java.util.Collections.shuffle ([]) lub zadzwoń rzeczywistą realizację (z PowerMockito.doCallRealMethod()). Ale nie możesz zrobić obu.

Jeśli usuniesz

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

będą weryfikowane rozmowa i testy minie.

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

Ten kod działa dla mnie:

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

Próbowałem tego, co zasugerowałeś, a mój test wciąż kończy się niepowodzeniem, stwierdzając, że nie było zero interakcji z próbą. Zobacz moją edycję. –

+0

Ah dziękuję ... Tęskniłem za częścią, w której muszę zadzwonić Collections.shuffle() ... Chociaż mogłem przysiąc, że próbowałem tego również. –

4

Jest to dość stare pytanie, ale to wciąż chciał wyjaśnić, że przyjęte rozwiązanie jest w rzeczywistości nieprawidłowe. Wykonując poniższy kod,

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

wszystkie weryfikuje zawsze przechodzą potem:

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

nawet jeśli nie nazywamy test.doSomething(); dostarczona Test odpowiedź będzie nadal przechodzić. Prawidłowym sposobem sprawdzenia tego jest faktyczne sprawdzenie, czy pozycje na liście zostały posortowane poprawnie.

Powiązane problemy