Как проверить вызов внешнего API в Spring Boot

У меня есть метод в классе обслуживания, который использует внешнюю оболочку для вызова слабого API. Оболочка, которую я использую, это один, если это имеет значение. Вот как я использую обертку,

//This is the method in my service class
public String sendMess(SlackObj obj) {
    //SlackObj contains the channel url, channel name and the message
    //build the payload from the SlackObj
    //Slack is the name of the wrapper's class that I'm using
    Slack slack = Slack.getInstance();
    //slack.send is the method that sends the message to slack
    WebhookResponse res = slack.send(url, payload);
    //other logic
}

//This is what I've tried
@Test
public void slackSendMessageTest(){
    //build the slack obj and payload
    //build the mock WebhookResponse
    Slack slackMock = mock(Slack.class)
    when(slackMock.send(channelUrl, payload)).thenReturn(mockWebHookRes);
    assertEquals("SUCCESS", testService.sendMessage(testSlackObj);
}

Я пытаюсь написать несколько тестов для этого метода, поэтому мой вопрос: как мне его протестировать, не отправляя сообщение каждый раз, когда я запускаю тест? Я считаю, что причина этого в том, что сам по себе слабый не издевается, и я понятия не имею, как внедрить макет в издевательский класс обслуживания.

Я открыт для рефакторинга класса обслуживания, если это поможет в тестировании. Любые предложения и рекомендации приветствуются. Спасибо.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
1 222
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вам придется найти способ издеваться над Slack, который, к сожалению, выглядит как синглтон.

Вот что я бы сделал:

1) Сделайте Slack доступным в виде bean-компонента, который может быть автоматически подключен:

@Configuration
public class SlackConfiguration {

    @Bean
    public Slack slack() {
        return Slack.getInstance();
    }
}

2) Измените свой класс, чтобы получить инъекцию Slack:

Обратите внимание, что я полностью угадываю имя здесь, поскольку вы просто показываете метод. Вы должны внедрить объект Slack, который вы превратили в @Bean выше, и не использовать Slack.getInstance() напрямую где-либо еще.

@Component
public class SlackService {
    private final Slack slack;

    @Autowired
    public SlackService(final Slack slack) {
        this.slack = slack;
    }

    public String sendMessage(final Object message) {
        final WebhookResponse res = slack.send(url, payload);
        // etc
    }
}

3) Смоделируйте объект Slack и передайте его вашему SlackService в тесте:

Это позволяет вам смоделировать реализацию Slack, чтобы вы могли изменить ее поведение. Я не буду вдаваться в издевательства в деталях.

public class SlacServiceTest {
    private final Slack slack = mock(Slack.class);
    private final SlackService serviceUnderTest = new SlackService(slack);

    @Test
    public void testSomething() {
        // TODO: set mock responses here
        // Given... when... then...
    }

}

Другие вопросы по теме