如何在Spring Boot中测试对外部api的调用

我在服务类中有一个方法,它使用外部包装器来调用slack 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);
}

我正在尝试为这个方法编写一些测试,所以我的问题是,如何在没有每次运行测试时发送消息的情况下测试它?我相信这是因为松弛本身并没有被嘲笑,我不知道如何将模拟注入到模拟的服务类中。

如果它有助于测试,我愿意重构服务类。任何建议和建议表示赞赏。谢谢。

3
投票

你将不得不找到一种方法来模拟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...
    }

}