[JAVA] Verwenden Sie DBUnit für den Spring Boot-Test

Abstrakt

Verwenden Sie dbunit, um Ihr Spring Boot-Projekt zu testen.

Umgebung

Annahme

Testziel

Säule Schimmel Primärschlüssel
person_id integer
person_name character varying(20)
birth_date date
birth_place character varying(20)

Ich habe den folgenden Mapper mit MyBatis für die Tabelle erstellt.

@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);
}

Detaillierte Vorgehensweise

Abhängigkeit hinzufügen

Fügen Sie den Abhängigkeiten spring-test-dbunit und dbunit hinzu.

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>

Voraussetzung Dateneingabe

Schreiben Sie Daten in die Datenbank, bevor Sie den Test ausführen (bevor Sie die Testmethode ausführen).

Grundverhalten

__ * In den folgenden Fällen werden die für den Test verwendeten Daten festgeschrieben. __ (Der Rollback-Fall wird später beschrieben.)

Beschreibung der Eingabedaten

Muster 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äfektur Hyogo" />
	<person person_id="3"                      birth_date="1994-02-22" birth_place="Tokio" />
</dataset>
Testklassenerstellung
// (1)
@RunWith(SpringRunner.class)
@SpringBootTest
@TestExecutionListeners({
	DependencyInjectionTestExecutionListener.class,
	DbUnitTestExecutionListener.class
})
public class PersonMapperTest {

	@Autowired // (2)
	PersonMapper mapper;

	@Test
	@DatabaseSetup("/dbunit/Muster A..xml") // (3)
	public void test() {
		//Testcode schreiben
	}
}
(1) Schreiben Sie alle obigen Anmerkungen in die Testklasse
(2) Autowired ist möglich, um Spring zu starten
(3) In der Testmethode@DatabaseSetupUnd beschreiben Sie den XML-Pfad in seinem Argument
Ausführungsergebnis
# SELECT * FROM person;
person_id | person_name | birth_date | birth_place
-----------+-------------+------------+-------------
        1 | Suzaki      | 1986-12-25 |
        2 | Nishi       |            |Präfektur Hyogo
        3 |             | 1994-02-22 |Tokio
(3 Zeilen)

Leeres Eingabemuster

Beschreibung der Eingabedaten

Wenn Sie eine Zeile mit Tags ohne Attribute wie unten gezeigt schreiben, wird nur DELETE ausgeführt und die Tabelle ist leer.

Muster B..xml


<?xml version="1.0" encoding="UTF-8"?>
<dataset>
	<person />
</dataset>
Ausführungsergebnis
# SELECT * FROM person;
 person_id | person_name | birth_date | birth_place
-----------+-------------+------------+-------------
(0 Zeile)

Leeres Zeicheneingabemuster

Beschreibung der Eingabedaten

Muster C..xml


<?xml version="1.0" encoding="UTF-8"?>
<dataset>
	<person person_id="4" person_name="" birth_date="1991-12-25" birth_place="Präfektur Hyogo" />
</dataset>

Wenn die obige XML-Datei mit dem grundlegenden Mustertestcode schreibgeschützt ist, tritt die folgende Ausnahme auf. 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)

Zusätzlicher Code

Fügen Sie dem gelesenen Pfad die folgende Konfiguration hinzu, wenn der Test ausgeführt wird.

@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) Registrieren Sie die Laufzeitkonfiguration als Bean
(2) Schalten Sie den Schalter ein, der Leerzeichen zulässt(Der Standardwert ist false)
(3) (1)Reflektieren Sie die Einstellungen der im Frühjahr verwendeten Datenquelle
Ausführungsergebnis
# SELECT * FROM person;
person_id | person_name | birth_date | birth_place
-----------+-------------+------------+-------------
        4 |             | 1991-12-25 |Präfektur Hyogo
(1 Zeile)
@Test
@DatabaseSetup("/dbunit/Muster C..xml")
public void test() {
  Person actual = mapper.selectById(4);
  assertThat(actual.getPerson_name()).isEqualTo(""); // ->Erfolg
}

Muster zur Rückgabe von Daten nach dem Testen

Testklassenerstellung

Fügen Sie dem Basismuster Listener und Anmerkungen hinzu.

@RunWith(SpringRunner.class)
@SpringBootTest
@TestExecutionListeners({
	DependencyInjectionTestExecutionListener.class,
	TransactionalTestExecutionListener.class, // (1)
	DbUnitTestExecutionListener.class
})
@Transactional //(2)
public class PersonMapperTest3 {
  ...
}
(1) Fügen Sie einen Listener für die Transaktionsverwaltung hinzu
(2) Die Einheit, die die Transaktion tatsächlich verwaltet(Grundsätzlich Klasse)damit@TransactionalGewähren

Sie können der Methode auch "@ Transactional" hinzufügen.

@Test
@Transactional
@DatabaseSetup("/dbunit/Muster A..xml")
public void test() {
  ...
}

Vermeiden Sie Warnungstext

Bei Ausführung mit dem obigen Muster wird das folgende Protokoll auf der WARN-Ebene ausgegeben. 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.

Da im Protokoll angegeben ist, dass DataTypeFactory nicht angegeben ist, fügen Sie der Konfigurationsklasse, die im Eingabemuster für leere Zeichen verwendet wird, die folgende Beschreibung hinzu.

@Bean
public DatabaseConfigBean dbUnitDatabaseConfig() {
  DatabaseConfigBean bean = new DatabaseConfigBean();

  bean.setAllowEmptyFields(true);
  bean.setDatatypeFactory(new PostgresqlDataTypeFactory()); // (1)

  return bean;
}
(1) Da PostgreSQL verwendet wird, wird die von dbunit bereitgestellte DataTypeFactory für PostgreSQL angegeben.

Angenommene Datendefinition

Grundverhalten

Angenommene Datenbeschreibung

Beschreiben Sie im gleichen Format wie die erforderlichen Daten. Wenn Null- oder Leerzeichen angenommen werden, entspricht dies der erforderlichen Dateneingabe.

Muster 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äfektur Hyogo" />
	<person person_id="3"                      birth_date="1994-02-22" birth_place="" />
</dataset>

Angenommenes Ergebnis 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äfektur 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äfektur Kanagawa" />
</dataset>
Testmethodenerstellung
@Test
@DatabaseSetup("/dbunit/Muster D..xml")
@ExpectedDatabase(
	value="/dbunit/Angenommenes Ergebnis 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äfektur Kanagawa");

	mapper.insert(param);
}
(1) Beschreiben Sie eine Anmerkung, die das erwartete Ergebnis angibt. Standardmäßig sind alle Tabellen aktiviert, jedoch assertionMode=NON_Wenn STRICT verwendet wird, wird nur die in xml beschriebene Tabelle überprüft.

Referenzseite

SpringBoot 45.Testing Implementierungsmethode für Spring Framework Unit-Tests 1-3. Repository-Test (Junit4, Spring-Test, DBUnit) │ ヰ Schwert-Spielzeugkiste How to set default properties in spring dataset DatabaseConfig - Stack Overflow

Recommended Posts

Verwenden Sie DBUnit für den Spring Boot-Test
Verwenden Sie Spring Test + Mockito + JUnit 4 für Spring Boot + Spring Retry Unit Test
Spring Boot + Springfox Springfox-Boot-Starter 3.0.0 Verwendung
Verwenden Sie Spring JDBC mit Spring Boot
Spring Boot zum Lernen von Anmerkungen
So schreiben Sie einen Komponententest für Spring Boot 2
Verwenden Sie die Standardauthentifizierung mit Spring Boot
Spring Boot zum ersten Mal
Häufige Anmerkungen für Spring Boot-Tests
Verwendung von ModelMapper (Spring Boot)
Beginnend mit Spring Boot 0. Verwenden Sie Spring CLI
Schreiben wir einen Testcode für die Anmeldefunktion mit Spring Boot
Führen Sie einen Transaktionsbestätigungstest mit Spring Boot durch
Der Spring Boot @ WebMvcTest-Test aktiviert die Standardsicherheit von Spring Security
WebMvcConfigurer-Memorandum von Spring Boot 2.0 (Spring 5)
Verwenden Sie den Cache mit EhCashe 2.x mit Spring Boot
Formularklassenvalidierungstest mit Spring Boot
Fordern Sie Spring Boot heraus
Spring Boot Form
Spring Boot Denken Sie daran
[Für den internen Gebrauch] Für diejenigen, die dem Spring Boot-Projekt zugewiesen sind (im Aufbau)
gae + frühlingsstiefel
Informationen zum Entwerfen einer Spring Boot- und Unit-Test-Umgebung
Testen Sie den Controller mit Mock MVC im Spring Boot
Verwenden Sie den Thymeleaf-Textvorlagenmodus von Spring Boot
Verwendung von MyBatis2 (iBatis) mit Spring Boot 1.4 (Spring 4)
Verwendung des eingebauten h2db mit Federstiefel
Servlet-Filter mit Spring Boot verwenden [Spring Boot 1.x, 2.x kompatibel]
Hinweise zu Anmerkungen beim Schreiben von Tests für Spring Boot
So führen Sie UT mit Excel als Testdaten mit Spring Boot + JUnit5 + DBUnit durch
Pläne zur Unterstützung von JDK 11 für Eclipse und Spring Boot
Einstellungen für die Verbindung zu MySQL mit Spring Boot + Spring JDBC
SPRING BOOT Lernaufzeichnung 01
Frühlingsstiefel + Heroku Postgres
Schreiben von Frühlingsstiefel-Memos (1)
[JUnit 5-kompatibel] Schreiben Sie einen Test mit JUnit 5 mit Spring Boot 2.2, 2.3
Erster Frühlingsstiefel (DI)
SPRING BOOT Lernprotokoll 02
[Spring Boot] So erstellen Sie ein Projekt (für Anfänger)
Spring Boot2 Spickzettel
Customizer für Platform Transaction Manager aus Spring Boot 1.5 hinzugefügt
Spring Boot-Ausnahmebehandlung
Spring Boot Servlet-Zuordnung
Spring Boot Entwicklung-Entwicklungsumgebung-
Spring Boot-Lernverfahren
[JUnit 5] Schreiben Sie einen Validierungstest mit Spring Boot! [Parametrisierungstest]
Spring Boot lernen [Anfang]
Schreiben von Spring Boot-Memos (2)
Spring Boot 2.2 Dokumentzusammenfassung
Testen Sie die Klasse mit Feldinjektion im Spring-Boot-Test, ohne den Spring-Container zu verwenden
[Spring Boot] DataSourceProperties $ DataSourceBeanCreationException
Spring Boot 2.3 Verfügbarkeit von Anwendungen
Spring Boot Tutorials Themen
Ich habe jetzt einen Test mit Spring Boot + JUnit 5 geschrieben
Datei-Upload mit Spring Boot (keine mehrteilige Datei verwenden)
Mit Spring Boot herunterladen
Erforderliche Schritte zum Ausgeben von asynchronen Spring Boot-Ereignissen
Ändern Sie das Injektionsziel für jede Umgebung mit Spring Boot 2
Aufrufen und Verwenden der API in Java (Spring Boot)
Spring 5 & Spring Boot 2 Einführung für Anfänger wurde veröffentlicht
Verwenden Sie thymeleaf3 mit parent, ohne Spring-Boot-Starter-Parent in Spring Boot anzugeben