Gitlab ci не запускает мои скрипты, поскольку для этого требуется подключение к базе данных

Я пытаюсь запустить модульный тест в 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"
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
90
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

ошибка от gitlab выглядит как ошибка проверки Mockito, которая не имеет ничего общего с доступом к базе данных.

Для этого есть две очевидные причины.

  1. В тестируемой службе есть логика, которая при задании тестовых условий позволяет избежать вызова AnnualReturnRepository.save().
  2. Ваши макеты неправильно вводятся в сервис.

Возможно, вы сможете предоставить определение теста и некоторый код тестируемой службы.

PS если вы хотите проверить только один вызов метода, можно пропустить times(1)

verify(annualReturnRepository).save(any(AnnualReturn.class));

После того, как автор добавил определения тестов

Глядя на тест, это кажется очень неуместным.

assertNotNull(annualReturnService.parseAnnualReturnDetails(fileDetails));

Вам следует вызывать только один метод тестируемой службы. Так же

any(AnnualReturn.class) // also checks for null

Я думаю, что все, что происходит в parseAnnualReturnDetails, возвращает некоторый ненулевой результат, когда вы вызываете его из теста, но когда он вызывается из фактического тестируемого сервиса, он возвращает AnnualReturn, избегая вызова репо и вызывая ошибку проверки Mockito.

Я обновил раздел проверки теста, но ошибка по-прежнему возникает.

AppleEater 08.04.2024 20:53

Привет, AbstractKamen, спасибо за ваш отзыв. Я новичок в мокито и тестировании. Как бы вы исправили эту ошибку?

AppleEater 08.04.2024 21:50

Здравствуйте, вам следует удалить вызов parseAnnualReturnDetails() из теста. Затем проверьте, нужно ли что-то еще имитировать, чтобы parseAnnualReturnDetails возвращал результат при вызове из тестируемой службы.

AbstractKamen 08.04.2024 21:59

Кроме того, я не понимаю, как вы запускаете тесты, если утверждаете, что это работает локально. Пробовали ли вы использовать mvn test -Dtest=com.test.unit.AnnualReturnServiceTest, чтобы лучше воспроизвести условия GitLab?

AbstractKamen 09.04.2024 12:22

Когда я запускаю тест как тест 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.

AppleEater 09.04.2024 14:22

Привет, AbstractKamen, спасибо за ваши предложения. Вы правы, это не проблема с базой данных, а ошибка скрипта. Я обновил скрипт, и он работает правильно.

AppleEater 09.04.2024 15:33

Другие вопросы по теме