Имитация частного метода void с помощью PowerMockito - PullRequest
0 голосов
/ 12 июля 2020
public class Abcd {
    
    public String one() {
        System.out.println("Inside method one");
        StringBuilder sb = new StringBuilder();
        two(sb);
        return "Done";
    }
    
    private void two(StringBuilder sb) {
        System.out.println("Inside method two");
    }
}

Вот тестовый класс

@RunWith(PowerMockRunner.class)
@PrepareForTest(Abcd.class)
public class TestAbcd {
    
    @Test
    public void testMethod1() throws Exception {
        Abcd abcd = PowerMockito.spy(new Abcd());
        StringBuilder sb = new StringBuilder();
        PowerMockito.doNothing().when(abcd, "two", sb);
        abcd.one();
    }
}

Вывод в консоль:

Inside method one
Inside method two

В отредактированной части нет трассировки сбоя: Трассировка сбоя:

введите описание изображения здесь

Пожалуйста, дайте мне знать, какую ошибку я делаю и как мне заставить ее работать.

1 Ответ

1 голос
/ 12 июля 2020

Вам нужна аннотация @PrepareForTest, чтобы получить такой контроль над частными методами с PowerMockito.

См. Эту статью: Что на самом деле означает @PrepareForTest в PowerMock?

В итоге тестовый пример должен выглядеть так:

@RunWith(PowerMockRunner.class)
@PrepareForTest(Abcd.class)
public class TestAbcd {
    
    @Test
    public void testMethod1() throws Exception {
        Abcd abcd = PowerMockito.spy(new Abcd());
        PowerMockito.doNothing().when(abcd, method(Abcd.class, "two", StringBuilder.class))
                .withArguments(any(StringBuilder.class));               
        abcd.one();
    }
}

...