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