मैं स्प्रिंग बूट 2.3.3 के साथ स्प्रिंग बैच का पता लगाने की कोशिश कर रहा हूं, और जाहिर है कि परीक्षण बहुत महत्वपूर्ण हैं

बैच कुछ भी नहीं पढ़ता/प्रक्रिया/लिखता है, मैंने अभी कंकाल बनाया है।

परीक्षण पक्ष पर मेरे पास निम्नलिखित है

@Autowired
private IntegrationTestsNeeds integrationTestsNeeds;
@Autowired
private JobLauncherTestUtils jobLauncherTestUtils;
@Autowired
private JobRepositoryTestUtils jobRepositoryTestUtils;

@AfterEach
void tearDown() throws InterruptedException {
    jobRepositoryTestUtils.removeJobExecutions();
}

@Test
void testUpdateStatisticsBatch() throws Exception {
    JobExecution jobExecution = jobLauncherTestUtils.launchJob();
    ExitStatus exitStatus = jobExecution.getExitStatus();
    Assertions.assertThat(exitStatus).isEqualTo(ExitStatus.COMPLETED);
} 

परीक्षण पास लेकिन @AfterEach विधि में मुझे निम्न त्रुटि है

org.springframework.dao.DataIntegrityViolationException: StatementCallback; SQL [delete from BATCH_STEP_EXECUTION]; 
Cannot delete or update a parent row: a foreign key constraint fails (`cvl`.`BATCH_STEP_EXECUTION_CONTEXT`, CONSTRAINT `STEP_EXEC_CTX_FK` FOREIGN KEY (`STEP_EXECUTION_ID`) REFERENCES `BATCH_STEP_EXECUTION` (`STEP_EXECUTION_ID`)); 
nested exception is java.sql.SQLIntegrityConstraintViolationException: Cannot delete or update a parent row: a foreign key constraint fails (`cvl`.`BATCH_STEP_EXECUTION_CONTEXT`, CONSTRAINT `STEP_EXEC_CTX_FK` FOREIGN KEY (`STEP_EXECUTION_ID`) REFERENCES `BATCH_STEP_EXECUTION` (`STEP_EXECUTION_ID`))

मैं किस प्रकार की त्रुटि कर रहा हूँ?

1
Gavi 26 अगस्त 2020, 01:39

2 जवाब

सबसे बढ़िया उत्तर

मुझे नहीं पता क्यों लेकिन लेनदेन टेम्पलेट का उपयोग करके समस्या हल हो गई है।

import org.springframework.transaction.support.TransactionTemplate

@Autowired
private TransactionTemplate transactionTemplate;

@AfterEach
void tearDown() {
    transactionTemplate.execute(ts -> {
        jobRepositoryTestUtils.removeJobExecutions();
        return null;
    });
}

भले ही jdbcTemplate डिलीट स्टेटमेंट को निष्पादित करने में सक्षम है, किसी कारण से डेटाबेस से पंक्तियों को वास्तव में हटाने में सक्षम नहीं है।

1
Gavi 26 अगस्त 2020, 22:31

मैं इस मुद्दे को पुन: पेश करने में सक्षम नहीं हूं, यहां एक उदाहरण है जो अपवाद के बिना गुजरता है:

import javax.sql.DataSource;

import org.junit.After;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;

import org.springframework.batch.core.ExitStatus;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.JobExecution;
import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;
import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
import org.springframework.batch.repeat.RepeatStatus;
import org.springframework.batch.test.JobLauncherTestUtils;
import org.springframework.batch.test.JobRepositoryTestUtils;
import org.springframework.batch.test.context.SpringBatchTest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder;
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBatchTest
@ContextConfiguration(classes = {MyJobTests.MyJobConfig.class})
public class MyJobTests {

    @Autowired
    private JobLauncherTestUtils jobLauncherTestUtils;
    @Autowired
    private JobRepositoryTestUtils jobRepositoryTestUtils;
    
    @Test
    public void testMyJob() throws Exception {
        JobExecution jobExecution = jobLauncherTestUtils.launchJob();
        ExitStatus exitStatus = jobExecution.getExitStatus();
        Assert.assertEquals(ExitStatus.COMPLETED, exitStatus);
    }

    @After
    public void tearDown() {
        jobRepositoryTestUtils.removeJobExecutions();
    }
    
    @Configuration
    @EnableBatchProcessing
    public static  class MyJobConfig {
        @Bean
        public Job job(JobBuilderFactory jobs, StepBuilderFactory steps) {
            return jobs.get("job")
                    .start(steps.get("step")
                            .tasklet((contribution, chunkContext) -> {
                                System.out.println("hello world");
                                return RepeatStatus.FINISHED;
                            })
                            .build())
                    .build();
        }

        @Bean
        public DataSource dataSource() {
            return new EmbeddedDatabaseBuilder()
                    .setType(EmbeddedDatabaseType.H2)
                    .addScript("/org/springframework/batch/core/schema-drop-h2.sql")
                    .addScript("/org/springframework/batch/core/schema-h2.sql")
                    .build();
        }
    }
}

स्प्रिंग बैच संस्करण 4.2.4

0
Mahmoud Ben Hassine 26 अगस्त 2020, 12:25