#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
.
Смысл здесь в том, чтобы протестировать функциональность загрузки. Если эта функция использует внешнюю службу, объект или что-то еще, вы должны издеваться над этой третьей частью программного обеспечения. В центре внимания всегда ваш код, ваша функциональность.
Возвращаясь к вашему коду, я бы проверил три аспекта:
- проверка файла
- вызов службы загрузки
- услуга «отправить исполнителю»