Издевательство над статическим классом с помощью powermockito

Несмотря на то, что я следовал руководству, я не могу имитировать статический метод с помощью PowerMock. Я пытаюсь издеваться над одноэлементным классом бога.

Код теста выглядит следующим образом:

@RunWith(PowerMockRunner.class)
@PrepareForTest(GodClass.class)
public class SomeTestCases {
    @Test
    public void someTest() {
         PowerMockito.mockStatic(GodClass.class);
         GodClass mockGod = mock(GodClass.class);
         when(GodClass.getInstance()).thenReturn(mockGod);
         // Some more things mostly like:
         when(mockGod.getSomethingElse()).thenReturn(mockSE);

         // Also tried: but doesn't work either
         // when(GodClass.getInstance().getSomethingElse()).thenReturn(mockSE);

         Testee testee = new Testee(); // Class under test
    }
}

И тестируемый:

class Testee {
     public Testee() {
    GodClass instance = GodClass.getInstance();
    Compoment comp = instance.getSomethingElse();
     }
}

Однако это не работает. Режим отладки показывает, что instance равно null. Что нужно сделать иначе?

(Да, я знаю, что код ужасен, но он унаследован, и мы хотим провести несколько модульных тестов перед рефакторингом)


person dtech    schedule 10.01.2014    source источник
comment
У меня отлично работает, я поместил свой код в ответ ниже, чтобы вы могли сравнить.   -  person Mike B    schedule 10.01.2014


Ответы (1)


Я только что ввел в основном то, что у вас есть, и у меня это работает нормально.

public class GodClass
{
    private static final GodClass INSTANCE = new GodClass();

    private GodClass() {}

    public static GodClass getInstance()
    {
        return INSTANCE;
    }

    public String sayHi()
    {
        return "Hi!";
    }
}

public class Testee
{
    private GodClass gc;
    public Testee() {
        gc = GodClass.getInstance();
    }

    public String saySomething()
    {
        return gc.sayHi();
    }
}

@RunWith(PowerMockRunner.class)
@PrepareForTest(GodClass.class)
public class GodClassTester
{
    @Test
    public void testThis()
    {
        PowerMockito.mockStatic(GodClass.class);
        GodClass mockGod = PowerMockito.mock(GodClass.class);
        PowerMockito.when(mockGod.sayHi()).thenReturn("Hi!");
        PowerMockito.when(GodClass.getInstance()).thenReturn(mockGod);

        Testee testee = new Testee();
        assertEquals("Hi!", testee.saySomething());

    }
}
person Mike B    schedule 10.01.2014