【问题标题】:How to test a call to external api in Spring Boot如何在 Spring Boot 中测试对外部 api 的调用
【发布时间】:2019-03-18 16:39:04
【问题描述】:

我在服务类中有一个方法,它使用外部包装器来调用 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 本身没有被模拟,我不知道如何将模拟注入到模拟的服务类中。

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

【问题讨论】:

    标签: java unit-testing spring-boot testing mockito


    【解决方案1】:

    不幸的是,您将不得不找到一种方法来模拟 Slack,这似乎是一个单例。

    我会这样做:

    1) 将Slack 作为可自动装配的 bean 提供:

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

    2) 更改您的课程以使用注入的Slack

    请注意,我完全是在猜测这里的名称,因为您只是展示了方法。您将注入您在上面转换为@BeanSlack 对象,而不是在其他任何地方直接使用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...
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 2022-12-05
      • 2021-07-16
      • 2023-03-19
      • 2016-07-19
      • 2017-11-23
      • 2018-02-16
      • 1970-01-01
      • 1970-01-01
      • 2018-10-20
      相关资源
      最近更新 更多