Я пытаюсь запустить модульный тест в gitlab, тест работает правильно в моей локальной среде, но в Gitlab я столкнулся с ошибкой ниже.
Я предполагаю, что у gitlab нет доступа к базе данных, поэтому скрипту не удается сохранить файл в базе данных.
Вот сообщение об ошибке, которое я получил в Gitlab
Error message:
[ERROR] Failures:
[ERROR] AnnualReturnServiceTest.testSave:102
Wanted but not invoked:
annualReturnRepository.save(
<any com.riskanalysisexpertsystem.scanpro.model.company.AnnualReturn>
);
-> at com.test.unit.AnnualReturnServiceTest.testSave(AnnualReturnServiceTest.java:102)
Actually, there were zero interactions with this mock.
Вот сценарий AnnualReturnServiceTest.testSave.
public class AnnualReturnServiceTest{
private Logger logger;
private PDFtoImageConverterUtility pdftoImageConverterUtility;
private final String SOURCE_FILE_PATH = "../scanpro/src/test/resources/files/taxdocuments/company/annual_return_form.pdf";
private final String SOURCE_DESTINATION_PATH = "../scanpro/src/test/resources/files/taxdocuments/company/annual_return.png";
@Mock
private AnnualReturnRepository annualReturnRepository;
@Mock
private OcrUtility ocrUtility;
@InjectMocks
private AnnualReturnService annualReturnService;
@BeforeClass
public void setUpBeforeClass() throws Exception{
logger = LogManager.getLogger(AnnualReturnServiceTest.class);
pdftoImageConverterUtility = new PDFtoImageConverterUtility();
MockitoAnnotations.openMocks(this);
}
public void testSave() {
logger.info("Mock file and file details");
pdftoImageConverterUtility.convertFile(SOURCE_FILE_PATH, SOURCE_DESTINATION_PATH);
File file = new File(SOURCE_DESTINATION_PATH);
String fileDetails = "Annual Return Form\n"
+ "Company Name: Apple Inc.\n"
+ "\n"
+ "TIN: 3243243\n"
+ "\n"
+ "Company Address: 32432 MaryDale Drive., Ghana 234324\n"
+ "Company Registration Number: 432432\n"
+ "Fiscal Year Start Date: 2022-01\n"
+ "\n"
+ "Fiscal Year End Date: 2022-12\n"
+ "\n"
+ "Total Revenue: 342432\n"
+ "\n"
+ "Total Expenses: 3434\n"
+ "\n"
+ "Taxable Income: 34333\n"
+ "\n"
+ "Tax Paid: 3243";
logger.info("Mock the behaviour of OCR utility");
when(ocrUtility.performOCR(file)).thenReturn(fileDetails);
logger.info("Call the save method");
annualReturnService.save(file);
logger.info("Verify that parseAnnualReturnDetails is not null");
try {
assertNotNull(annualReturnService.parseAnnualReturnDetails(fileDetails));
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
logger.info("Verify the annualReturnRepository's save method is called");
verify(annualReturnRepository, times(1)).save(any(AnnualReturn.class));
}
}
Ежегодное обслуживание возврата
@Service
@RequiredArgsConstructor
public class AnnualReturnService {
private final AnnualReturnRepository annualReturnRepository;
public void save(File file) {
OcrUtility ocrUtility = new OcrUtility();
String fileDetails = ocrUtility.performOCR(file);
if (fileDetails != null) {
AnnualReturn annualReturn = new AnnualReturn();
try {
annualReturn = parseAnnualReturnDetails(fileDetails);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if (annualReturn != null) {
annualReturnRepository.save(annualReturn);
}
}
}
.gitlab-ci
test:
stage: test
script:
- mvn test -Dtest=com.test.unit.AnnualReturnServiceTest
allow_failure: true
dependencies:
- build
artifacts:
paths:
- target/surefire-reports
expire_in: "30 days"
ошибка от gitlab выглядит как ошибка проверки Mockito, которая не имеет ничего общего с доступом к базе данных.
Для этого есть две очевидные причины.
Возможно, вы сможете предоставить определение теста и некоторый код тестируемой службы.
PS если вы хотите проверить только один вызов метода, можно пропустить times(1)
verify(annualReturnRepository).save(any(AnnualReturn.class));
Глядя на тест, это кажется очень неуместным.
assertNotNull(annualReturnService.parseAnnualReturnDetails(fileDetails));
Вам следует вызывать только один метод тестируемой службы. Так же
any(AnnualReturn.class) // also checks for null
Я думаю, что все, что происходит в parseAnnualReturnDetails, возвращает некоторый ненулевой результат, когда вы вызываете его из теста, но когда он вызывается из фактического тестируемого сервиса, он возвращает AnnualReturn, избегая вызова репо и вызывая ошибку проверки Mockito.
Привет, AbstractKamen, спасибо за ваш отзыв. Я новичок в мокито и тестировании. Как бы вы исправили эту ошибку?
Здравствуйте, вам следует удалить вызов parseAnnualReturnDetails() из теста. Затем проверьте, нужно ли что-то еще имитировать, чтобы parseAnnualReturnDetails возвращал результат при вызове из тестируемой службы.
Кроме того, я не понимаю, как вы запускаете тесты, если утверждаете, что это работает локально. Пробовали ли вы использовать mvn test -Dtest=com.test.unit.AnnualReturnServiceTest, чтобы лучше воспроизвести условия GitLab?
Когда я запускаю тест как тест testng в eclipse, я получаю следующий вывод: 05:21:34.333 [main] INFO com.test.unit.AnnualReturnServiceTest — имитирует поведение утилиты OCR 05:21:34.386 [main] INFO com.test.unit.AnnualReturnServiceTest -- Вызовите метод сохранения 05:21:37.386 [main] INFO com.test.unit.AnnualReturnServiceTest -- Убедитесь, что parseAnnualReturnDetails не равно нулю 05:21:37.393 [main] INFO com.test. unit.AnnualReturnServiceTest — убедитесь, что вызывается метод сохранения AnnualReturnRepository.
Привет, AbstractKamen, спасибо за ваши предложения. Вы правы, это не проблема с базой данных, а ошибка скрипта. Я обновил скрипт, и он работает правильно.
Я обновил раздел проверки теста, но ошибка по-прежнему возникает.