2008-10-22 2 views
7

У меня есть следующий класс:Моментальные непубличные статические методы в абстрактных классах с JMockit?

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» вместо «Мок». Любые идеи почему? Я делаю что-то неправильно? Я пробовал объявить свой макетный класс абстрактным, но безрезультатно.

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

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

+0

Просто для прохождения googler .. принятый ответ теперь устарел, поскольку Mockit.redefineMethods устарел ... Я пытаюсь найти правильный. – 2010-12-14 13:06:01

ответ

6

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

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

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

Вам даже не нужно ставить его в MockParent. – 2008-10-22 15:05:16

+1

jmockit смотрит только на общедоступные методы. Это позволяет вашей макетной реализации иметь внутренние методы, которые не соответствуют методам в исходном классе. – 2008-10-23 00:10:10

4

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

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

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

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

Я реализовал это в примере project on github.

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