Dans les applications qui utilisent Spring Boot Décrit comment implémenter UT avec JUnit5 + DBUnit.
La structure du projet étant basée sur Spring Initializr, Vous pouvez facilement vérifier le fonctionnement en vous reportant à ce qui suit.
J'ai utilisé My Batis + Oracle pour vérifier l'opération. Veuillez faire correspondre la bibliothèque à utiliser pour chaque environnement.
build.gradle
plugins {
id 'org.springframework.boot' version '2.2.6.RELEASE'
id 'io.spring.dependency-management' version '1.0.9.RELEASE'
id 'java'
id 'eclipse'
}
group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '12'
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter'
implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.1.0'
testImplementation('org.springframework.boot:spring-boot-starter-test') {
exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
}
//Veuillez définir pour chaque DB
runtime files('libs/ojdbc8.jar')
// Lombok
compileOnly 'org.projectlombok:lombok'
// JUnit5
testImplementation 'org.junit.jupiter:junit-jupiter:5.5.2'
testImplementation 'org.junit.platform:junit-platform-commons:1.5.2'
testImplementation 'com.github.springtestdbunit:spring-test-dbunit:1.3.0'
// DBUnit
testImplementation 'org.dbunit:dbunit:2.6.0'
}
test {
useJUnitPlatform()
}
application.yml Puisqu'il s'agira des informations de connexion d'Oracle, veuillez les définir pour chaque base de données. Il existe également un "schéma" dans l'attribut de source de données, mais veuillez le définir séparément. Lors de l'enregistrement des données de test, les informations contenues dans datasource.schema ne sont pas référencées et une exception se produit.
application.yml
spring:
datasource:
url: jdbc:oracle:thin:@localhost:1521/XEPDB1
username: sample
password: sample
driverClassName: oracle.jdbc.OracleDriver
schema: SAMPLE
mybatis:
type-aliases-package: com.example.demo.entity
configuration:
map-underscore-to-camel-case: true
Pour Oracle ... (ry
CREATE TABLE SAMPLE_TABLE
( SAMPLE_ID NUMBER NOT NULL,
SAMPLE_NAME VARCHAR2(255 CHAR) NOT NULL,
CONSTRAINT "PK_SAMPLE_TABLE" PRIMARY KEY (SAMPLE_ID)
);
Entity
SampleTable.java
@Data
public class SampleTable {
private long sampleId;
private String sampleName;
}
Repository ( Mapper )
SampleTableRepository.java
@Mapper
public interface SampleTableRepository {
@Select("SELECT SAMPLE_ID, SAMPLE_NAME FROM SAMPLE_TABLE WHERE SAMPLE_ID = #{sampleId}")
SampleTable findOne(long sampleId);
}
DBConfig pour l'exécution du test. Utilisez cette classe de configuration pour configurer la source de données et le schéma.
DbConfig.java
@Configuration
public class DbConfig {
@Bean(name = "dbUnitDatabaseConnection")
public DatabaseDataSourceConnectionFactoryBean dbUnitDatabaseConnection(DataSource dataSource, @Value(value = "${schema}") String schema) {
DatabaseDataSourceConnectionFactoryBean connectionFactory = new DatabaseDataSourceConnectionFactoryBean();
connectionFactory.setDataSource(dataSource);
connectionFactory.setSchema(schema);
return connectionFactory;
}
}
XlsDataSetLoader.java
public class XlsDataSetLoader extends AbstractDataSetLoader {
@Override
protected IDataSet createDataSet(Resource resource) throws IOException, DataSetException {
try (InputStream inputStream = resource.getInputStream()) {
return new XlsDataSet(inputStream);
}
}
}
@DbUnitConfiguration: Veuillez définir la source de données de la "Classe de configuration de la base de données de test" et de la "Classe de chargeur pour Excel" ci-dessus. @DatabaseSetup: définissez pour chaque test et définissez la source de données, les données de test et la méthode d'enregistrement définies dans @DbUnitConfiguration.
python
@SpringBootTest
@TestExecutionListeners({ DependencyInjectionTestExecutionListener.class, DirtiesContextTestExecutionListener.class, TransactionDbUnitTestExecutionListener.class, DbUnitTestExecutionListener.class })
@DbUnitConfiguration(dataSetLoader = XlsDataSetLoader.class, databaseConnection = { "dbUnitDatabaseConnection" })
public class SampleTableRepositoryTest {
@Autowired
SampleTableRepository sampleTableRepository;
@Test
@DatabaseSetup(connection = "dbUnitDatabaseConnection", value = "/testdata/findOneTest.xlsx", type = DatabaseOperation.CLEAN_INSERT)
void Les données peuvent être acquises normalement() {
SampleTable actual = sampleTableRepository.findOne(3L);
Assertions.assertEquals("NAME_C", actual.getSampleName(), "SAMPLE_La valeur de NAME est celle attendue");
}
}
Nom de la feuille: nom de la table 1ère ligne: nom de la colonne Deuxième ligne et suivantes: Données
Lorsque le test est exécuté avec la configuration ci-dessus, les données de test Excel seront enregistrées dans le DB. La difficulté est que la vitesse est lente. (Peut-être que la configuration n'est pas bonne À l'avenir, j'essaierai d'améliorer les performances.
Recommended Posts