如何在Spring Boot中测试对外部api的调用
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在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);
}
我正在尝试为这个方法编写一些测试,所以我的问题是,如何在没有每次运行测试时发送消息的情况下测试它?我相信这是因为松弛本身并没有被嘲笑,我不知道如何将模拟注入到模拟的服务类中。
如果它有助于测试,我愿意重构服务类。任何建议和建议表示赞赏。谢谢。
答案
你将不得不找到一种方法来模拟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...
}
}
以上是关于如何在Spring Boot中测试对外部api的调用的主要内容,如果未能解决你的问题,请参考以下文章
如何从 Spring Boot 应用程序调用外部 JWT API 服务 [关闭]
Spring Boot - 模拟对外部 API 的 POST REST 请求