Смоделируйте внешний вызов приватным методом в java

Я хочу протестировать класс ClassToTest для его метода methodToTest. Но я не могу это сделать, так как частный метод anotherMethod, который вызывается methodToTest, имеет некоторую зависимость от значения, возвращаемого одноэлементным классом SingletonClass с использованием его открытого метода getName.

Я пытался использовать макет powermock privateMethod и статический метод mock и все такое, но не помогло.
У кого-нибудь есть решение для этого сценария?

Class ClassToTest{
    public void methodToTest(){
        ...
        anotherMethod();
        ...
    }

    private void anotherMethod(){
        SingletonClass singletonObj = SingletonClass.getInstance();
        String name = singletonObj.getName();
        ...
    }
}

person Anoop Narayanan    schedule 24.01.2013    source источник
comment
дубликат? см. это. В качестве альтернативы, если вы можете изменить ClassToTest (?), Было бы целесообразно ослабить зависимость от синглтона.   -  person Pyranja    schedule 25.01.2013


Ответы (2)


Используйте mockStatic (см. http://code.google.com/p/powermock/wiki/MockitoUsage13#Mocking_Static_Method)

@RunWith(PowerMockRunner.class)
@PrepareForTest({SingletonClass.class})
public class ClassToTestTest {
    @Test
    public void testMethodToTest() {
        SingletonClass mockInstance = PowerMockito.mock(SingletonClass.class);
        PowerMockito.mockStatic(SingletonClass.class);
        PowerMockito.when(SingletonClass.getInstance()).thenReturn(mockInstance);
        PowerMockito.when(mockInstance.getName()).thenReturn("MOCK NAME");

        //...
    }
}
person Matt Lachman    schedule 25.01.2013

Вы должны быть в состоянии использовать частичный макет, чтобы справиться с этой ситуацией. Похоже, вы хотите создать экземпляр объекта, но вы просто хотите увидеть, вызывает ли объект метод AnotherMethod(), фактически не выполняя никакой логики в другом методе. Если я правильно понимаю, следующее должно достичь вашей цели.

@RunWith(PowerMockRunner.class)
@PrepareForTest({ClassToTest.class})
public class ClassToTestTest {
    @Test
    public void testMethodToTest() {
        ClassToTest mockInstance = 
                   PowerMock.createPartialMock(SingletonClass.class,"anotherMethod");
        PowerMock.expectPrivate(mockInstance, "anotherMethod");
        PowerMock.replay(mockInstance);
        mockInstance.methodToTest();
        PowerMock.verify(mockInstance);
    }
}
person HardcoreBro    schedule 16.04.2013