Utilisez dbunit pour tester votre projet Spring Boot.
colonne | Moule | Clé primaire |
---|---|---|
person_id | integer | 〇 |
person_name | character varying(20) | |
birth_date | date | |
birth_place | character varying(20) |
J'ai créé le mappeur suivant avec MyBatis pour la table.
@Mapper
public interface PersonMapper {
@Select("SELECT * FROM person WHERE person_id = #{personId}")
public Person selectById(int personId);
@Insert("INSERT INTO person(person_id, person_name, birth_date, birth_place) VALUES (#{person_id}, #{person_name}, #{birth_date}, #{birth_place})")
public void insert(Person person);
}
Ajoutez spring-test-dbunit
et dbunit
aux dépendances.
pom.xml
<dependency>
<groupId>com.github.springtestdbunit</groupId>
<artifactId>spring-test-dbunit</artifactId>
<version>1.3.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.dbunit</groupId>
<artifactId>dbunit</artifactId>
<version>2.6.0</version>
<scope>test</scope>
</dependency>
Écrivez les données dans le DB avant d'exécuter le test (avant d'exécuter la méthode de test).
__ * Dans les cas suivants, les données utilisées pour le test seront validées __ (Le cas de rollback sera décrit plus loin)
dataset
et décrivez la valeur de données pour saisir le nom de colonne dans la valeur d'attribut dans le nom d'attribut.Motif A.xml
<?xml version="1.0" encoding="UTF-8"?>
<dataset>
<person person_id="1" person_name="Suzaki" birth_date="1986-12-25" />
<person person_id="2" person_name="Nishi" birth_place="Préfecture de Hyogo" />
<person person_id="3" birth_date="1994-02-22" birth_place="Tokyo" />
</dataset>
// (1)
@RunWith(SpringRunner.class)
@SpringBootTest
@TestExecutionListeners({
DependencyInjectionTestExecutionListener.class,
DbUnitTestExecutionListener.class
})
public class PersonMapperTest {
@Autowired // (2)
PersonMapper mapper;
@Test
@DatabaseSetup("/dbunit/Motif A.xml") // (3)
public void test() {
//Écrire le code de test
}
}
(1) | Écrivez toutes les annotations ci-dessus dans la classe de test |
(2) | Autowired est possible pour démarrer Spring |
(3) | Dans la méthode de test@DatabaseSetup Et décrivez le chemin xml dans son argument |
# SELECT * FROM person;
person_id | person_name | birth_date | birth_place
-----------+-------------+------------+-------------
1 | Suzaki | 1986-12-25 |
2 | Nishi | |Préfecture de Hyogo
3 | | 1994-02-22 |Tokyo
(3 lignes)
Si vous écrivez une balise sans attributs comme indiqué ci-dessous, seul DELETE sera exécuté et la table sera vide.
Motif B.xml
<?xml version="1.0" encoding="UTF-8"?>
<dataset>
<person />
</dataset>
# SELECT * FROM person;
person_id | person_name | birth_date | birth_place
-----------+-------------+------------+-------------
(0 ligne)
Modèle C.xml
<?xml version="1.0" encoding="UTF-8"?>
<dataset>
<person person_id="4" person_name="" birth_date="1991-12-25" birth_place="Préfecture de Hyogo" />
</dataset>
Si le xml ci-dessus est en lecture seule avec le code de test de modèle de base, l'exception suivante se produit.
java.lang.IllegalArgumentException: table.column=person.person_name value is empty but must contain a value (to disable this feature check, set DatabaseConfig.FEATURE_ALLOW_EMPTY_FIELDS to true)
Ajoutez la configuration suivante au chemin lu lors de l'exécution du test.
@Configuration
public class DatasourceConfig {
// (1)
@Bean
public DatabaseConfigBean dbUnitDatabaseConfig() {
DatabaseConfigBean bean = new DatabaseConfigBean();
bean.setAllowEmptyFields(true); // (2)
return bean;
}
// (3)
@Bean
public DatabaseDataSourceConnectionFactoryBean dbUnitDatabaseConnection(
DatabaseConfigBean dbUnitDatabaseConfig,
DataSource dataSource
) {
DatabaseDataSourceConnectionFactoryBean bean = new DatabaseDataSourceConnectionFactoryBean(dataSource);
bean.setDatabaseConfig(dbUnitDatabaseConfig);
return bean;
}
}
(1) | Enregistrez la configuration d'exécution en tant que bean |
(2) | Activez le commutateur qui autorise les caractères vides(Le défaut est faux) |
(3) | (1)Refléter les paramètres de la source de données utilisée dans Spring |
# SELECT * FROM person;
person_id | person_name | birth_date | birth_place
-----------+-------------+------------+-------------
4 | | 1991-12-25 |Préfecture de Hyogo
(1 ligne)
@Test
@DatabaseSetup("/dbunit/Modèle C.xml")
public void test() {
Person actual = mapper.selectById(4);
assertThat(actual.getPerson_name()).isEqualTo(""); // ->Succès
}
Ajoutez des écouteurs et des annotations au modèle de base.
@RunWith(SpringRunner.class)
@SpringBootTest
@TestExecutionListeners({
DependencyInjectionTestExecutionListener.class,
TransactionalTestExecutionListener.class, // (1)
DbUnitTestExecutionListener.class
})
@Transactional //(2)
public class PersonMapperTest3 {
...
}
(1) | Ajouter un écouteur pour la gestion des transactions |
(2) | L'unité qui gère réellement la transaction(Fondamentalement classe)alors@Transactional Subvention |
Vous pouvez également ajouter «@ Transactional» à la méthode.
@Test
@Transactional
@DatabaseSetup("/dbunit/Motif A.xml")
public void test() {
...
}
Lorsqu'il est exécuté avec le modèle ci-dessus, le journal suivant est généré au niveau WARN.
Potential problem found: The configured data type factory 'class org.dbunit.dataset.datatype.DefaultDataTypeFactory' might cause problems with the current database 'PostgreSQL' (e.g. some datatypes may not be supported properly). In rare cases you might see this message because the list of supported database products is incomplete (list=[derby]). If so please request a java-class update via the forums.If you are using your own IDataTypeFactory extending DefaultDataTypeFactory, ensure that you override getValidDbProducts() to specify the supported database products.
Étant donné que le journal indique que DataTypeFactory n'est pas spécifié, ajoutez la description suivante à la classe de configuration utilisée dans le modèle d'entrée de caractère vide.
@Bean
public DatabaseConfigBean dbUnitDatabaseConfig() {
DatabaseConfigBean bean = new DatabaseConfigBean();
bean.setAllowEmptyFields(true);
bean.setDatatypeFactory(new PostgresqlDataTypeFactory()); // (1)
return bean;
}
(1) | Puisque PostgreSQL est utilisé, le DataTypeFactory pour PostgreSQL fourni par dbunit est spécifié. |
Décrivez dans le même format que les données préalables. Lorsque des caractères nuls ou vides sont supposés, c'est le même que l'entrée de données prérequises.
Modèle D.xml
<?xml version="1.0" encoding="UTF-8"?>
<dataset>
<person person_id="1" person_name="Suzaki" birth_date="1986-12-25" />
<person person_id="2" person_name="Nishi" birth_place="Préfecture de Hyogo" />
<person person_id="3" birth_date="1994-02-22" birth_place="" />
</dataset>
Résultat présumé 1.xml
<?xml version="1.0" encoding="UTF-8"?>
<dataset>
<person person_id="1" person_name="Suzaki" birth_date="1986-12-25" />
<person person_id="2" person_name="Nishi" birth_place="Préfecture de Hyogo" />
<person person_id="3" birth_date="1994-02-22" birth_place="" />
<person person_id="11" person_name="Uesaka" birth_date="1991-12-19" birth_place="Préfecture de Kanagawa" />
</dataset>
@Test
@DatabaseSetup("/dbunit/Modèle D.xml")
@ExpectedDatabase(
value="/dbunit/Résultat présumé 1.xml",
assertionMode=DatabaseAssertionMode.NON_STRICT
) // (1)
public void test() {
Person param = new Person();
param.setPerson_id(11);
param.setPerson_name("Uesaka");
param.setBirth_date(new Date(91, 11, 19));
param.setBirth_place("Préfecture de Kanagawa");
mapper.insert(param);
}
(1) | Décrivez une annotation qui spécifie le résultat attendu. Par défaut, toutes les tables sont vérifiées, mais assertionMode=NON_Avec STRICT, seule la table décrite en xml est inspectée. |
SpringBoot 45.Testing Méthode d'implémentation du test de Spring Framework Unit 1-3. Test du référentiel (Junit4, spring-test, DBUnit) │ ヰ Boîte à jouets Sword How to set default properties in spring dataset DatabaseConfig - Stack Overflow
Recommended Posts