2015-08-03 2 views
3

This is the same question as found here. К сожалению, принятый ответ не работает для меня. У меня есть статический класс утилиты с частными методами, которые мне нужно проверить. Я считаю, что, когда я высмеивать такие методы, как это:Как я могу высмеять частный статический метод с помощью PowerMockito?

PowerMockito.spy(StaticUtil.class); 
PowerMockito.when(StaticUtil.class, "getSomethingMethod", someObjectArray, someStringArray, aBoolean, someList).thenReturn(anotherList); 

Я получаю исключение нулевого указателя, поскольку getSomethingMethod() фактически называют. Когда я отлаживаю, я вижу, что он не вызывается, когда я запускаю метод, который я пытаюсь проверить, но он работает, когда я настраиваю макет. Based on this site, похоже, что это должно произойти, когда вы создаете макет в этом формате.

Итак я пытаюсь настроить Ложная таким образом:

PowerMockito.spy(StaticUtil.class);   
PowerMockito.doReturn(anotherList).when(StaticUtil.getSomethingMethod(someObjectArray, someStringArray, aBoolean, someList); 

Однако я получаю сообщение об ошибке от Eclipse, который говорит, что я должен изменить видимость getSomethingMethod() общественности. Не является ли одним из больших преимуществ использования PowerMockito, что вы можете издеваться над частными методами? Мне нужно высмеять этот метод private static (без фактического вызова метода во время установки).

+0

Могли бы вы вставить больше кода ваших тестов? Является ли ваш тестовый класс надлежащим образом подготовлен к мошенничеству? –

+0

Дикая догадка, у вас нет '@ PrepareForTest' –

ответ

6

Вы должны использовать точный синтаксис , указанный в the answer you linked. Этот синтаксис составляет doReturn(returnValue).when(Class, String, arguments);. Ни один из приведенных здесь примеров не использует этот пример.

Вот некоторые расширенные пояснения. Я бросил вместе основу тест-образец, чтобы продемонстрировать это:

Попытка запустить тесты этого класса:

package org.test.stackoverflow; 

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

public class StaticUtil { 
    public static void Wrapper() { 
    getSomethingMethod(null, null, false, Collections.<String>emptyList()); 
    } 

    private static List<String> getSomethingMethod(Object[] obj, 
     String[] str, boolean flag, List<String> aList){ 
    System.out.println("I happen!"); 
    return aList; 
    } 
} 

Если сам метод вызывается, мы увидим I happen!. Если это не так, мы не будем.

Затем я использую этот тестовый класс:

package org.test.stackoverflow; 

import java.util.List; 

import org.junit.runner.RunWith; 
import org.junit.*; 
import org.powermock.api.mockito.PowerMockito; 
import org.powermock.core.classloader.annotations.PrepareForTest; 
import org.powermock.modules.junit4.PowerMockRunner; 

@RunWith(PowerMockRunner.class) 
@PrepareForTest(org.test.stackoverflow.StaticUtil.class) 
public class StaticUtilTest { 
    Object[] someObjectArray; 
    String[] someStringArray; 
    boolean aBoolean; 
    List<String> someList; 
    List<String> anotherList; 

    @Test 
    public void testWhenClassStringMethod() throws Exception { 
    System.out.println("Beginning Test when(Class klass, String method name).doReturn(result)"); 
    PowerMockito.spy(StaticUtil.class); 
    PowerMockito.when(StaticUtil.class, "getSomethingMethod", someObjectArray, someStringArray, aBoolean, someList).thenReturn(anotherList); 
    System.out.println("End Test when"); 
    } 

    @Test 
    public void testDoReturnActualMethod() throws Exception { 
    PowerMockito.spy(StaticUtil.class); 
    // This doesn't compile as you've correctly stated 
// PowerMockito.doReturn(anotherList).when(StaticUtil.getSomethingMethod(someObjectArray, someStringArray, aBoolean, someList); 
    } 

    @Test 
    public void testDoReturnClassStringMethod() throws Exception { 
    System.out.println("Beginning Test doReturn().when(Class klass, String method name"); 
    PowerMockito.spy(StaticUtil.class); 
    PowerMockito.doReturn(anotherList).when(StaticUtil.class, "getSomethingMethod", someObjectArray, someStringArray, aBoolean, someList); 
    System.out.println("End Test doReturn"); 
    } 
} 

Так что, если он печатает I happen, то мы использовали неправильный синтаксис. Когда я запускаю эту программу, мы получим:

Beginning Test when(Class klass, String method name).doReturn(result) 
I happen! 
End Test when 
Beginning Test doReturn().when(Class klass, String method name) 
End Test doReturn 

Таким образом, вы должны использовать синтаксис в третьем тесте.

Примечание: в этом примере используются статические, пустые аргументы; очевидно, что вы должны настроить свой пример на использование Argument Matchers, как обычно для вашего приложения.

+0

Большое спасибо за подробный ответ, я потратил такое долгое время на это! Синтаксис в третьем тесте работал отлично. СПАСИБО СПАСИБО СПАСИБО! – user3897392

+0

Как прошел третий тест? «Слушай!» строка не печатается, это не значит, что насмешка настроена правильно. здесь вы пытались издеваться над классом StaticUtil, но вы не вызывали оболочку тестового метода. см. мой другой ответ. – kswaughs

-3

Когда вы устанавливаете ожидания на макет объекта, вы должны использовать аргументы аргументов, такие как Matchers.any() или Matchers.anyString(), но не фактические аргументы.

Для получения более подробной информации см мой ответ на J-Unit Test: Make static void method in final class throw exception

Существует потенциальная проблема с durron597's answer: синтаксис в «testDoReturnClassStringMethod» поругаем не правильно. В этом методе он пытался издеваться над классом StaticUtil, но не вызывал оболочку тестового метода.Смотрите пример

@Test 
public void testDoReturnClassStringMethod() throws Exception { 
    System.out.println("Beginning Test doReturn().when(Class klass, String method name"); 
    PowerMockito.spy(StaticUtil.class); 
    PowerMockito.doReturn(anotherList).when(StaticUtil.class, "getSomethingMethod", someObjectArray, someStringArray, aBoolean, someList); 
    StaticUtil.Wrapper(); 
    System.out.println("End Test doReturn"); 
} 

Результат для этого

Beginning Test doReturn().when(Class klass, String method name 
I happen! 
End Test doReturn 

'Я случайно! печатается. mock настроен неправильно.

Правильный способ насмешки является:

@Test 
public void testDoReturnWithProperMock() throws Exception { 
    System.out.println("Beginning Test doReturn().when(Class klass, String method name"); 
    PowerMockito.spy(StaticUtil.class); 
    PowerMockito.doReturn(anotherList).when(StaticUtil.class, "getSomethingMethod", Matchers.anyObject(), Matchers.anyObject(), Matchers.anyBoolean(), Matchers.anyList()); 
    StaticUtil.Wrapper(); 
    System.out.println("End Test doReturn"); 

} 

, для которых результат:

Beginning Test doReturn().when(Class klass, String method name 
End Test doReturn 
+0

вниз избиратель, пожалуйста, уточните причину для отклонения правильного ответа. – kswaughs

+3

Это пограничный ответ только для ссылок. Вы должны расширить свой ответ, указав здесь как можно больше информации, и используйте ссылку только для справки. –

+1

Это ответ только на связь с другим вопросом, который ответил @kswaughs. Здесь необходимо поместить соответствующую информацию, или этот вопрос должен быть помечен как дубликат связанного вопроса. – dcsohl

Смежные вопросы