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

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

最佳答案

不幸的是,您将必须找到一种模拟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...
    }

}

07-24 09:45
查看更多