У меня есть метод в классе обслуживания, который использует внешнюю оболочку для вызова слабого 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, который, к сожалению, выглядит как синглтон.
Вот что я бы сделал:
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...
}
}