Пересмешивать закрытые статические методы в абстрактных классах с помощью JMockit? - PullRequest
7 голосов
/ 22 октября 2008

У меня есть следующий класс:

public abstract class AbstractParent {
    static String method() {
        return "OriginalOutput";
    }
}

Я хочу издеваться над этим методом. Я решил использовать JMockit . Поэтому я создаю ложный класс:

public class MockParent {
    static String method() {
        return "MOCK";
    }
}

И мой тестовый код выглядит так:

public class RealParentTest {

    @Before
    public void setUp() throws Exception {
        Mockit.redefineMethods( AbstractParent.class, MockParent.class );
    }


    @Test
    public void testMethod() {
        assertEquals(MockParent.method(),AbstractParent.method());
    }

}

К сожалению, этот тест говорит, что AbstractParent возвращает «OriginalOutput» вместо «MOCK». Есть идеи почему? Я делаю что-то неправильно? Я попытался объявить мой фиктивный класс также абстрактным, но безрезультатно.

Редактировать Обратите внимание, что общедоступный метод приводит к тому, что тест выполняется без проблем ... это странно, потому что с JMockit вы должны иметь возможность имитировать методы любой области действия.

Ответ Только публичный метод должен быть публичным, вы можете оставить оригинальный метод как есть.

Ответы [ 2 ]

6 голосов
/ 22 октября 2008

Нашли решение: вам просто нужно сделать метод макета общедоступным (оригинальный метод может остаться в своей первоначальной видимости).

Я не знаю, почему это работает, в то время как оригинальный способ не работает (тот, кто делает это, более чем приветствует присоединение), но все, что вам нужно сделать, это просто изменить класс mock в приведенном выше примере на:

public class MockParent {
    public static String method() {
        return "MOCK";
    }
}
4 голосов
/ 14 декабря 2010

Видимо, новый способ сделать это - использовать MockUp<T>

new MockUp<AbstractParent>(){
    @Mock String method() {
        return "MOCK";
    }
};

assertEquals("MOCK" AbstractParent.method());

Другая альтернатива, очевидно, состоит в том, чтобы продолжить что-то вроде MockParent с аннотацией @MockClass. Сам этого не делал, так как другая встроенная версия делает свою работу.

Я реализовал это в примере проекта на github .

...