Verwenden Sie dbunit, um Ihr Spring Boot-Projekt zu testen.
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);
}
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>
Schreiben Sie Daten in die Datenbank, bevor Sie den Test ausführen (bevor Sie die Testmethode ausführen).
__ * In den folgenden Fällen werden die für den Test verwendeten Daten festgeschrieben. __ (Der Rollback-Fall wird später beschrieben.)
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>
// (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@DatabaseSetup Und beschreiben Sie den XML-Pfad in seinem Argument |
# 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)
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>
# SELECT * FROM person;
person_id | person_name | birth_date | birth_place
-----------+-------------+------------+-------------
(0 Zeile)
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)
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 |
# 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
}
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@Transactional Gewähren |
Sie können der Methode auch "@ Transactional" hinzufügen.
@Test
@Transactional
@DatabaseSetup("/dbunit/Muster A..xml")
public void test() {
...
}
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. |
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>
@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. |
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