[JAVA] Ich habe versucht, Spring + Mybatis + DbUnit zu verwenden

Ich hatte die Gelegenheit, DB in der Spring + Mybatis-Umgebung zu testen und zu untersuchen, wie DbUnit verwendet wird. (Ich werde es posten, damit ich es nicht vergesse) Da Transaktionen auf der Spring-Seite verwaltet werden, sind einige Einstellungen für die Verknüpfung mit DbUnit erforderlich.

Betriebsumgebung

MW Version
Java 7
postgresql 9.5
spring-core 4.3.7.RELEASE
mybatis 3.4.2
mybatis-spring 1.3.1
spring-jdbc 4.3.7.RELEASE
spring-test 4.3.7.RELEASE
dbunit 2.5.3
spring-context 4.3.7.RELEASE
postgresql(jdbc Driver) 42.0.0.jre7

Bean-Dateieinstellungen

Um spring und DbUnit zu verknüpfen, fügen Sie der Beans-Definitionsdatei von spring die folgende Definition hinzu. DbUnit und Spring scheinen die Transaktionen des anderen zu verwalten, wie unten gezeigt Wenn Sie die dataSource nicht in die TransactionAwareDataSourceProxy-Klasse einschließen, wird der Datensatz in DbUnit nicht zurückgesetzt.

applicationContext.xml



    <!--Datenquelleneinstellungen(Referenz) -->
   <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
      <property name="driverClassName" value="org.postgresql.Driver"/>
      <property name="url" value="jdbc:postgresql://localhost:5432/<DB-Name>" />
      <property name="username" value="<Umweltabhängig>" />
      <property name="password" value="<Umweltabhängig>" />
   </bean>

   <!--Wenn Sie dbunit mit spring verwenden, wickeln Sie die dataSource wie folgt ein-->
   <bean id="dataSourceTest"
    class="org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy">
    <constructor-arg ref="dataSource" />
   </bean>

Testquelle

Informationen zum Festlegen der Testquelle von Junit.

Anmerkungen wie @RunWith haben dieselben Einstellungen wie bei Verwendung von spring. Die Klasse erbt von DataSourceBasedDBTestCase, um DbUnit zu verwenden.

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
@Transactional
public class DocumentMapperTest extends DataSourceBasedDBTestCase {

Wenn Sie die zu testende Mapper-Klasse und DataSourceBasedDBTestCase erben, setzen Sie dataSourceTest auf DI von @Autowired, um als Rückgabewert von getDataSource () verwendet zu werden, der implementiert werden muss.

    @Autowired
    DocumentMapper mapper;

    @Autowired
    DataSource dataSourceTest;

    @Rule
    public TestName name = new TestName();

Wenn Sie super.setUp () in @Before aufrufen, wird es vor dem Test eingerichtet.

@Before
    public void setUp() throws Exception {
        // super.setUp()DB kann vor der Testausführung durch Aufruf eingerichtet werden.
        // setUp()Wenn Sie nicht mit anrufen, ist in der Testmethode ein Setup erforderlich
        // super.setUp();
    }

Wie im vorherigen Satz erwähnt, muss getDataSource () implementiert werden, indem die DataSourceBasedDBTestCase-Klasse geerbt wird. Hier wird der von @Autowired festgelegte dataSourceTest zurückgegeben.

    @Override
    protected DataSource getDataSource() {
        return this.dataSourceTest;
    }

GetDataSet (), das in der Vererbung der DataSourceBasedDBTestCase-Klasse implementiert werden muss. Der Datensatz in der DB wird hier zurückgegeben. getDataSet () wird in super.setUp () aufgerufen. Hier wird die Excel-Datei (XLS-Format), die dem Namen der Testmethode entspricht, als DB-Daten aus dem Klassenpfad übergeben. Wenn Sie null in die Excel-Datei schreiben, wird diese als Zeichenfolge anstelle von null behandelt, sodass sie mithilfe der von DbUnit bereitgestellten ReplacementDataSet-Klasse durch null ersetzt wird (der Teil, der in der Excel-Datei null ist, wird durch [null] definiert). .. In der neuesten DbUnit kann nicht nur das XLS-Format, sondern auch das XLSX-Format verwendet werden.

    @Override
    protected IDataSet getDataSet() throws Exception {

        String pathName = name.getMethodName();

        String xlsname = pathName + ".xls";
        InputStream is = getClass().getClassLoader().getResourceAsStream(xlsname);
        XlsDataSet dataSet = new XlsDataSet(is);

        ReplacementDataSet replacement = new ReplacementDataSet(dataSet);
        // [null]Ersetzt durch null
        replacement.addReplacementObject("[null]", null);
        // [systemtime]Durch aktuelles Datum und Uhrzeit ersetzen
        replacement.addReplacementObject("[systemtime]", toDateTimeStr(nowTime));

        return replacement;
    }

Mit den obigen Einstellungen können Sie mit Spring + Mybatis + DbUnit testen. Tatsächlich gibt es bereits eine Spring Test DB Unit, daher ist es möglicherweise besser, diese ohne unnötigen Aufwand zu verwenden.

Referenzquelle)

pom.xml


<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>sample</groupId>
  <artifactId>SpringMybatisDbUnit</artifactId>
  <version>0.0.1-SNAPSHOT</version>

  <dependencies>
    <!-- https://mvnrepository.com/artifact/org.springframework/spring-core -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-core</artifactId>
      <version>4.3.7.RELEASE</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.4.2</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis-spring</artifactId>
      <version>1.3.1</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-jdbc</artifactId>
      <version>4.3.7.RELEASE</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.springframework/spring-test -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-test</artifactId>
      <version>4.3.7.RELEASE</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.dbunit/dbunit -->
    <dependency>
      <groupId>org.dbunit</groupId>
      <artifactId>dbunit</artifactId>
      <version>2.5.3</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>4.3.7.RELEASE</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.postgresql/postgresql -->
    <dependency>
      <groupId>org.postgresql</groupId>
      <artifactId>postgresql</artifactId>
      <version>42.0.0.jre7</version>
    </dependency>
  </dependencies>
</project>

Document.java


package mng.doc.dao;

import java.lang.reflect.Field;
import java.util.Date;

public class Document {

    private Integer id;
    private String name;
    private String registrant;
    private Date registrationtime;
    private String editor;
    private Date edittime;

    public Integer getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public String getRegistrant() {
        return registrant;
    }

    public String getEditor() {
        return editor;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setRegistrant(String registrant) {
        this.registrant = registrant;
    }

    public void setEditor(String editor) {
        this.editor = editor;
    }

    public Date getRegistrationtime() {
        return registrationtime;
    }

    public Date getEdittime() {
        return edittime;
    }

    public void setRegistrationtime(Date registrationtime) {
        this.registrationtime = registrationtime;
    }

    public void setEdittime(Date edittime) {
        this.edittime = edittime;
    }

    public String toString() {

        StringBuilder sb = new StringBuilder();
        sb.append("Document [");
        Field[] fields = this.getClass().getDeclaredFields();
        for (int i = 0; i < fields.length; i++) {

            Field field = fields[i];
            String name = field.getName();
            field.setAccessible(true);
            Object value = null;
            try {
                value = field.get(this);
            } catch (IllegalArgumentException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }

            sb.append(name + " = " + value);
            if (i != (fields.length - 1)) {
                sb.append(", ");
            }
        }
        sb.append("]");
        return sb.toString();
    }
}

DucumentMapper.java


package mng.doc.mapper;

import java.util.Date;
import java.util.List;

import org.apache.ibatis.annotations.Param;

import mng.doc.dao.Document;

public interface DocumentMapper {

    public List<Document> selectAll();
    public Integer insertDocument(Document doc);
    public Integer updateDocument(@Param("editor") String editor, @Param("edittime") Date edittime);
    public Integer deleteDocument(Integer id);
}

DocumentMapper.xml


<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="mng.doc.mapper.DocumentMapper">

  <resultMap id="baseMap" type="mng.doc.dao.Document">
    <id property="id" jdbcType="INTEGER" column="id" />
    <result property="name" jdbcType="VARCHAR" column="name" />
    <result property="registrant" jdbcType="VARCHAR" column="registrant" />
    <result property="registrationtime" jdbcType="TIMESTAMP" column="registration_time" />
    <result property="editor" jdbcType="VARCHAR" column="editor" />
    <result property="edittime" jdbcType="TIMESTAMP" column="edit_time" />
  </resultMap>

  <select id="selectAll" resultMap="baseMap">
    SELECT
    *
    FROM
    DOCUMENT
  </select>
  <insert id="insertDocument" parameterType="mng.doc.dao.Document">
    INSERT INTO
    DOCUMENT
    (name, registrant, registration_time)
    VALUES
    (
    #{name},
    #{registrant},
    #{registrationtime}

    )
  </insert>
  <update id="updateDocument">
    UPDATE
    DOCUMENT
    SET
    editor = #{editor},
    edit_time = ${edittime}
  </update>

  <delete id="deleteDocument" parameterType="java.lang.Integer">
    DELETE
    FROM
    DOCUMENT
    WHERE
    id = #{id}
  </delete>
</mapper>

DocumentMapperTest.java


package mng.doc.mapper;

import static org.junit.Assert.*;

import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import javax.sql.DataSource;
import mng.doc.dao.Document;
import org.dbunit.DataSourceBasedDBTestCase;
import org.dbunit.database.DatabaseConnection;
import org.dbunit.dataset.IDataSet;
import org.dbunit.dataset.ReplacementDataSet;
import org.dbunit.dataset.excel.XlsDataSet;
import org.dbunit.operation.DatabaseOperation;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TestName;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.transaction.annotation.Transactional;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
@Transactional
public class DocumentMapperTest extends DataSourceBasedDBTestCase {

    Long nowTime = System.currentTimeMillis();

    @Autowired
    DocumentMapper mapper;

    @Autowired
    DataSource dataSourceTest;

    @Rule
    public TestName name = new TestName();


    @Test
    public void testSelectAll() throws Exception {
        prepare();
        List<Document> documents = this.mapper.selectAll();
        for (Document c : documents) {
            System.out.println(c.toString());
        }
    }

    @Before
    public void setUp() throws Exception {
        // super.setUp()DB kann vor der Testausführung durch Aufruf eingerichtet werden.
        // setUp()Wenn Sie nicht mit anrufen, ist in der Testmethode ein Setup erforderlich
        // super.setUp();
    }

    public void prepare() throws Exception {
        DatabaseConnection connection = new DatabaseConnection(this.dataSourceTest.getConnection());
        DatabaseOperation.CLEAN_INSERT.execute(connection, getDataSet());
    }

    public void resetSequenceName(String sequenceName) throws Exception {
        DatabaseConnection connection = new DatabaseConnection(this.dataSourceTest.getConnection());
        connection
        .getConnection()
        .createStatement()
        .executeQuery("select setval('" + sequenceName + "', 1, false)");
    }

    @Override
    protected DataSource getDataSource() {
        return this.dataSourceTest;
    }

    @Override
    protected IDataSet getDataSet() throws Exception {

        String pathName = name.getMethodName();

        String xlsname = pathName + ".xls";
        InputStream is = getClass().getClassLoader().getResourceAsStream(xlsname);
        XlsDataSet dataSet = new XlsDataSet(is);

        ReplacementDataSet replacement = new ReplacementDataSet(dataSet);
        // [null]Ersetzt durch null
        replacement.addReplacementObject("[null]", null);
        // [systemtime]Durch aktuelles Datum und Uhrzeit ersetzen
        replacement.addReplacementObject("[systemtime]", toDateTimeStr(nowTime));

        return replacement;
    }

    private String toDateTimeStr(Long time) {
        return toDateTimeStr(new Date(time));
    }

    private String toDateTimeStr(Date date) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss.SSS");
        String result = sdf.format(date);
        System.out.println(result);
        return result;
    }
}

applicationContext.xml


<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://www.springframework.org/schema/beans"
    xmlns:jdbc="http://www.springframework.org/schema/jdbc"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
        http://www.springframework.org/schema/jdbc
        http://www.springframework.org/schema/jdbc/spring-jdbc-3.2.xsd">

    <!--Datenquelleneinstellungen-->
   <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
      <property name="driverClassName" value="org.postgresql.Driver"/>
      <property name="url" value="jdbc:postgresql://localhost:5432/<DB-Name>" />
      <property name="username" value="<Umweltabhängig>" />
      <property name="password" value="<Umweltabhängig>" />
   </bean>

  <!--Transaction Manager-Einstellungen-->
  <bean id="transactionManager"
      class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource" />
  </bean>

  <!--SqlSessionFactory-Einstellungen-->
  <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
  </bean>

  <!--Registrierung der Mapper-Schnittstelle-->
  <bean id="sampleMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
    <property name="mapperInterface" value="mng.doc.mapper.DocumentMapper" />
    <property name="sqlSessionFactory" ref="sqlSessionFactory" />
  </bean>

  <bean id="dataSourceTest"
    class="org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy">
    <constructor-arg ref="dataSource" />
  </bean>

</beans>

document.sql


-- Table: public.document

-- DROP TABLE public.document;

CREATE TABLE public.document
(
  id integer NOT NULL DEFAULT nextval('document_id_seq'::regclass),
  name text NOT NULL,
  registrant character varying(50),
  registration_time timestamp without time zone,
  editor character varying(50),
  edit_time timestamp without time zone,
  CONSTRAINT document_pkey PRIMARY KEY (id, name)
)
WITH (
  OIDS=FALSE
);
ALTER TABLE public.document
  OWNER TO postgres;

Recommended Posts

Ich habe versucht, Spring + Mybatis + DbUnit zu verwenden
Ich habe es mit Spring versucht.
[Ich habe es versucht] Spring Tutorial
Ich habe versucht, Gson zu benutzen
Ich habe versucht, TestNG zu verwenden
Ich habe Spring Batch ausprobiert
Ich habe versucht, Galasa zu benutzen
[Für Anfänger] Ich habe versucht, DBUnit mit Eclipse zu verwenden
Ich habe versucht, Azure Cloud-Init zu verwenden
Ich habe Spring State Machine ausprobiert
Ich habe versucht, Apache Wicket zu verwenden
Ich habe versucht, Java REPL zu verwenden
Ich habe jetzt versucht, Anakia + Jing zu verwenden
Ich habe versucht, JOOQ mit Gradle zu verwenden
Ich habe versucht, die Java8 Stream API zu verwenden
Ich habe versucht, JWT in Java zu verwenden
Ich habe GraphQL mit Spring Boot ausprobiert
[Android] Ich habe versucht, das Koordinatorlayout zu verwenden.
Ich habe Flyway mit Spring Boot ausprobiert
Ich habe versucht, Pari GP Container zu verwenden
Ich habe versucht, WebAssembly Stadio (Version 2018/4/17) zu verwenden.
Ich habe versucht, mit Swagger mit Spring Boot zu beginnen
Ich habe versucht, Java Memo LocalDate zu verwenden
Ich habe versucht, Google HttpClient von Java zu verwenden
Ich habe versucht, mithilfe von JDBC Template mit Spring MVC eine Verbindung zu MySQL herzustellen
Ich habe versucht, die Elasticsearch-API in Java zu verwenden
Ich habe versucht, Realm mit Swift UI zu verwenden
Ich habe versucht, das Java-Diagnosetool Arthas zu verwenden
Ich habe versucht, UICollectionViewListCell zu verwenden, das von Xcode12 hinzugefügt wurde.
Ich habe versucht, Scalar DL mit Docker zu verwenden
Ich habe versucht, OnlineConverter mit SpringBoot + JODConverter zu verwenden
Es ist neu, aber ich habe versucht, Groonga zu verwenden
Ich habe versucht, OpenCV mit Java + Tomcat zu verwenden
Ich habe Lazy Initialization mit Spring Boot 2.2.0 ausprobiert
Ich habe Spring Data JDBC 1.0.0.BUILD-SNAPSHOT ausprobiert (-> 1.0.0.RELEASE)
Ich habe versucht, Tomcat zu setzen
Ich habe youtubeDataApi ausprobiert.
Ich habe versucht, ① umzugestalten
Ich habe FizzBuzz ausprobiert.
Ich habe JHipster 5.1 ausprobiert
Ich habe versucht, Junit mit Mac VScode Maven zu verwenden
[Für Anfänger] Ich habe versucht, JUnit 5 mit Eclipse zu verwenden
[Android] Ich habe SQLite beendet und versucht, Realm zu verwenden
Ich habe mit Ruby einen Blackjack gemacht (ich habe versucht, Minitest zu verwenden)
[API] Ich habe versucht, die Postleitzahlensuch-API zu verwenden
Ich habe versucht, JavaFX und Spring Framework zu verknüpfen.
Ich habe versucht, einen Server mit Netty zu implementieren
Ich habe versucht, den Profiler von IntelliJ IDEA zu verwenden
Ich möchte eine Verbindung herstellen, wenn eine Datenbank mit Spring und MyBatis erstellt wird
Ich habe versucht, das Hochladen von Dateien mit Spring MVC zu implementieren
Ich habe versucht, die Server-Push-Funktion von Servlet 4.0 zu verwenden
Ich habe versucht, Autoware auszuführen
Ich habe versucht, den KMS-Dienst (Key Management Service) von Alibaba Cloud zu verwenden
Ich habe versucht, SQS mit AWS Java SDK zu betreiben
05. Ich habe versucht, die Quelle von Spring Boot zu löschen
Ich habe sofort QUARKUS ausprobiert
Ich habe versucht, die Kapazität von Spring Boot zu reduzieren
Ich habe versucht, das Migration Toolkit für Anwendungsbinärdateien zu verwenden