Недавно я работал над дополнением модульных тестов, и тут у меня заболела голова;
у меня есть одинpublicMethod
метод,позвонилprivateMethod
метод。
Мне нужноpublicMethod
методтест,Но я не хочу тестироватьprivateMethod
метод。
Как написать этот единственный тест? ? ?
Классы и методы, которые необходимо протестировать
package com.banmoon.service.impl;
import com.banmoon.service.PowerMockitoService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
@Slf4j
@Service
@RequiredArgsConstructor
public class PowerMockitoServiceImpl implements PowerMockitoService {
@Override
public void publicMethod(String name) {
log.info("Открытый метод: {}", name);
privateMethod(name);
}
private void privateMethod(String name) {
log.info("Частный метод: {}", name);
}
}
можно увидетьpublicMethod
методназываетсяprivateMethod
,То есть общедоступный метод вызывает частный метод.
Нам нужно приватизироватьметодруководитьmock
package com.banmoon.powerMockitoTest;
import com.banmoon.service.impl.PowerMockitoServiceImpl;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import static org.mockito.ArgumentMatchers.anyString;
/**
* @author banmoon
* @date 2024/07/15 18:09:02
*/
@RunWith(PowerMockRunner.class)
@PrepareForTest(PowerMockitoServiceImpl.class)
public class PublicCallPrivateMethodTest {
@InjectMocks
private PowerMockitoServiceImpl powerMockitoServiceImplUnderTest;
@Test
public void testPublicMethod() throws Exception {
// Установить параметры
powerMockitoServiceImplUnderTest = PowerMockito.spy(powerMockitoServiceImplUnderTest);
PowerMockito.doNothing()
.when(powerMockitoServiceImplUnderTest, PowerMockito.method(PowerMockitoServiceImpl.class, "privateMethod", String.class))
.withArguments(anyString());
// Запуск тестов
powerMockitoServiceImplUnderTest.publicMethod("name");
// Результаты проверки
PowerMockito.verifyPrivate(powerMockitoServiceImplUnderTest).invoke("privateMethod", anyString());
}
}
Обращать внимание,Местоположение утверждения используетPowerMockito.verifyPrivate()
,Для частных методов можно сделать несколько утверждений.