Как имитировать обслуживание в модульном тесте

#java #spring #unit-testing #junit #mockito

Вопрос:

Например, у меня есть этот метод в FileServiceImpl:

 @Service
public class FileServiceImpl implements FileService {

private final ExecutorService executorService;
private final UploadsService uploadsService;
private final CandidatesService candidatesService;

@Autowired
public FileServiceImpl(ExecutorService executorService, UploadsService uploadsService, CandidatesService candidatesService) {
    this.executorService = executorService;
    this.uploadsService = uploadsService;
    this.candidatesService = candidatesService;
}

@Override
public Upload uploadFile(MultipartFile file) throws IOException {
    String filename = file.getOriginalFilename();
    if (!filename.endsWith(".xlsx")) {
        throw new IOException("File format is not .xlsx");
    }

    Upload upload = new Upload(UploadStatus.IN_PROGRESS, LocalDateTime.now(), filename);
    uploadsService.saveUpload(upload);

    executorService.execute(new XLSXAsyncImporter(upload, file.getInputStream(), uploadsService, candidatesService));

    return upload;
    }
}
 

Как мне нужно написать модульный тест? Я начал писать это:

 @ExtendWith(MockitoExtension.class)
public class FileServiceImplTest {

@Mock
private ExecutorService executorService;

@Mock
private UploadsService uploadsService;

@Mock
private CandidatesService candidatesService;

private FileServiceImpl fileService;

private Upload upload;
private MockMultipartFile file1, file2;

@BeforeEach
public void setUp() {
    fileService = new FileServiceImpl(executorService, uploadsService, candidatesService);

    upload = new Upload(UploadStatus.DONE, LocalDateTime.of(2021, 1, 1, 0, 0), "filename");
    file1 = new MockMultipartFile("filename 1", "filename.xlsx", "multipart/form-data", "".getBytes());
    file2 = new MockMultipartFile("filename 2", "", "multipart/form-data", "".getBytes());
}
 

Я хочу написать два теста: метод обслуживания выполнен и метод обслуживания вызывает исключение IOException.
Пожалуйста, не могли бы вы помочь написать мне методы тестирования? Я покрыл тестами более простые другие сервисы. Но я не понимаю, что мне нужно с этим делать.

Комментарии:

1. Для начала: вы не должны насмехаться ExecutorService . Используйте настоящий.

2. @Луи Вассерман, спасибо за ваш совет. Но почему? Не придется ли мне использовать executorService.execute метод проверки при проверке? Можете ли вы объяснить, почему я не должен издеваться над этим? Я хотел бы понять, как правильно писать тесты.

3. Нет, с чего бы тебе? Это деталь реализации. Вы должны использовать реальные типы в тестах везде, где это возможно, и использовать насмешки только для вещей, которые было бы дорого настроить.

4. Это потому, что в настоящее время в нашей команде есть тесты такого типа, поэтому мне нужно сделать это таким образом — это моя задача

Ответ №1:

Во-первых, как вы и думали, не обязательно использовать реальные ExecutorService .

Смысл здесь в том, чтобы протестировать функциональность загрузки. Если эта функция использует внешнюю службу, объект или что-то еще, вы должны издеваться над этой третьей частью программного обеспечения. В центре внимания всегда ваш код, ваша функциональность.

Возвращаясь к вашему коду, я бы проверил три аспекта:

  1. проверка файла
  2. вызов службы загрузки
  3. услуга «отправить исполнителю»