2013-06-04 3 views
2
public class A{ 
    protected Integer methodA(String a){ 
     //some code is included; 
     return new Integer(1); 
    } 
} 
public class B extends B{ 
    String b = "AnyThing"; 
    methodA(b); 
    //there are also other methods that will be tested 
} 

Ниже частичный тест-кодыКак использовать EasyMock для подделки защищенного метода?

B classUnderTest = createMockBuild(B.class).addMockedMethod(B.class.getDeclaredMethod(methodA(), String.class)).createMock; 
expect(classUnderTest.methodA(anyObject(String.class))).andReturn(new Integer(1)); 

вторая строка второго фрагмента код, даже не может пройти через компиляцию. Где не так?

ответ

0

Джейн, относительно вашего главный вопрос, линия

expect(classUnderTest.methodA(anyObject(String.class))).andReturn(new Integer(1)); 

будет компилировать успешно, если @Test класс находится в том же package, как ваш подлежащий тестированию - в этом случае оба класса A и B (если class B extends A). Защищенные методы экземпляра видны только для классов в одном пакете.

Удачи вам!

+0

Да, я думаю, вы правы. Я сделал внутренний класс, расширяет класс, который я хочу проверить, чтобы решить эту проблему. – Jane

0

Почему бы вам не попробовать что-то вроде:

@Test 
public void test() { 
    B classUnderTest = EasyMock.createMock(B.class); 
    expect(classUnderTest.methodA(anyObject(String.class))).andReturn(new Integer(1)); 
    replay(classUnderTest); 
    classUnderTest.methodA("foo"); 
    verify(classUnderTest); 
} 
+0

B класс, который я хочу проверить. Я не хочу издеваться над всеми методами. Я просто хочу издеваться над методом из своего родителя. – Jane

+0

Вы не будете издеваться над всеми методами. Если вы добавите 'classUnderTest.methodB()' прямо перед проверкой, вы получите для него «Неожиданный вызов метода», который походит на поведение, которое вы хотите. Единственный метод издевательства - 'methodA'. – condit

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