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



我在服务类中有一个使用外部包装器调用松弛 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);
}

我正在尝试为此方法编写一些测试,所以我的问题是,如何在每次运行测试时发送消息的情况下对其进行测试? 我相信造成这种情况的原因是因为 slack 本身没有被嘲笑,我不知道如何将模拟注入被嘲笑的服务类中。

如果它有助于测试,我愿意重构服务类。任何建议和建议将不胜感激。谢谢。

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

相关内容

  • 没有找到相关文章

最新更新