Как проверить вызов внешнего API в Spring Boot - PullRequest
0 голосов
/ 18 марта 2019

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

//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);
}

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

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

1 Ответ

3 голосов
/ 18 марта 2019

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

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

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

@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...
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...