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