2013-07-30 2 views
5

Я пытаюсь проверить, что метод Collections.shuffle() был вызван в одном из моих классов. Я прочитал (небольшую) документацию по PowerMock с Mockito и прочитал другие вопросы, которые касались этой проблемы, и не получил разрешения.Статические насмешки с PowerMock и Mockito не работают

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

Учитывая приведенный выше код, я ожидаю, что пройденный тест пройдет. Тем не менее, единичный тест не выполнен следующим образом:

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

Что я делаю неправильно?

Благодаря

EDIT: По предложению ниже я попытался следующий, и я получаю ту же ошибку.

@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

Что произойдет, если вы ослабляете ограничение на свой матчи от 'anyListOf' до' any (List.class) '? Что произойдет, если вы добавите «ClassToTest» в аннотацию '@ PrepareForTest'? –

ответ

4

Вы можете издеваться/проверить метод java.util.Collections.shuffle ([]) или вызвать реальное осуществление (с PowerMockito.doCallRealMethod()). Но вы не можете обойти оба.

Если удалить

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

вызов будет проверен и тест будет проходить.

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

Этот код работает для меня:

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

Я попробовал то, что вы предложили, и мой тест все еще не отвечает, что есть нулевые взаимодействия с макетом. См. Мое редактирование. –

+0

Ах, спасибо ... Я пропустил ту часть, где мне нужно вызвать Collections.shuffle() ... Хотя я мог бы поклясться, что я тоже это пробовал. –

4

Это довольно старый вопрос, но я все же хотел бы уточнить, что принятый ответ фактически неверный. При выполнении следующего кода

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

все проверяет, всегда будут проходить после:

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

, даже если вы не вызываете test.doSomething(); предоставленный тест в ответ будет еще пройти. Правильный способ проверить это - проверить, правильно ли отсортированы элементы в списке.