NosuchtableException에 직면하지 않고 일반 JDBC 및 HSQLDB를 사용하여 DBUNIT로 어떻게 테스트합니까?

StackOverflow https://stackoverflow.com/questions/1530951

문제

나는 평범한 JDBC와 HSQLDB와 함께 DBUNIT를 사용하려고 노력하고 있으며, DBUNIT를 이전에 최대 절전 모드와 함께 사용했지만 큰 성공을 거두었습니다. 코드는 다음과 같습니다.

import java.sql.PreparedStatement;
import org.dbunit.IDatabaseTester;
import org.dbunit.JdbcDatabaseTester;
import org.dbunit.dataset.IDataSet;
import org.dbunit.dataset.xml.XmlDataSet;
import org.junit.Test;

public class DummyTest {

    @Test
    public void testDBUnit() throws Exception {
        IDatabaseTester databaseTester = new JdbcDatabaseTester("org.hsqldb.jdbcDriver", "jdbc:hsqldb:mem", "sa", "");
        IDataSet dataSet = new XmlDataSet(getClass().getResourceAsStream("dataset.xml"));
        databaseTester.setDataSet(dataSet);
        databaseTester.onSetup();
        PreparedStatement pst = databaseTester.getConnection().getConnection().prepareStatement("select * from mytable");
    }
}

그리고 이것은 DataSet.xml입니다.

<dataset>
    <table name="mytable">
        <column>itemnumber</column>
        <column>something</column>
        <column>other</column>
        <row>
            <value>1234abcd</value>
            <value>something1</value>
            <value>else1</value>
        </row>
    </table>
</dataset>

이 테스트는 나에게 nosuchtableException을 제공합니다.

org.dbunit.dataset.NoSuchTableException: mytable
    at org.dbunit.database.DatabaseDataSet.getTableMetaData(DatabaseDataSet.java:282)
    at org.dbunit.operation.DeleteAllOperation.execute(DeleteAllOperation.java:109)
    at org.dbunit.operation.CompositeOperation.execute(CompositeOperation.java:79)
    at org.dbunit.AbstractDatabaseTester.executeOperation(AbstractDatabaseTester.java:190)
    at org.dbunit.AbstractDatabaseTester.onSetup(AbstractDatabaseTester.java:103)
    at DummyTest.testDBUnit(DummyTest.java:18)

DataBasetester.onsetup () 행을 제거하면 대신 SQLEXCEPTION이 나타납니다.

java.sql.SQLException: Table not found in statement [select * from mytable]
    at org.hsqldb.jdbc.Util.throwError(Unknown Source)
    at org.hsqldb.jdbc.jdbcPreparedStatement.<init>(Unknown Source)
    at org.hsqldb.jdbc.jdbcConnection.prepareStatement(Unknown Source)
    at DummyTest.testDBUnit(DummyTest.java:19)

데이터 세트 자체가 작동합니다.

ITable table = dataSet.getTable("mytable");
String firstCol = table.getTableMetaData().getColumns()[0];
String tName = table.getTableMetaData().getTableName();

내가 여기서 무엇을 놓치고 있습니까?

편집하다: @MLK가 지적한 것처럼 DBUNIT는 테이블을 만들지 않습니다. 데이터 세트를 추가하기 전에 다음을 삽입하면 모든 것이 순조롭게 진행됩니다.

PreparedStatement pp = databaseTester.getConnection().getConnection().prepareStatement(
     "create table mytable ( itemnumber varchar(255) NOT NULL primary key, "
   + " something varchar(255), other varchar(255) )");
pp.executeUpdate();

후속 질문을 다음과 같이 게시했습니다 DBUNIT가 데이터 세트 또는 DTD에서 테이블을 자동으로 작성하는 방법이 있습니까?

도움이 되었습니까?

해결책

DBUNIT는 테이블을 만들지 않습니다. XML 파일에 제공된 제한된 정보도 마찬가지입니다. 최대 절전 테이블을 만들 수 있다고 생각합니다.

이것이 제가 메모리 인 데이터베이스 사용을 중단 한 이유 중 하나이며 대신 DBA에 각 개발자에게 자체 데이터베이스를 제공하도록했습니다. 그런 다음 모든 개발자는 나중에 라이브로 운영되는 동일한 스크립트를 사용하여 데이터베이스를 최신 상태로 유지합니다. 이렇게하면 작은 오버 헤드가 추가됩니다 (모든 개발자는 데이터베이스를 최신 상태로 유지해야합니다). 그러나 각 실행에 대한 데이터베이스 구축에 대해 엉망이 될 필요는 없으며 쿼리가 실시간으로 실행되었는지 확인할 수 있습니다.

두 번째 이유는 속도였습니다. Memory-Database를 만드는 것이 기존 데이터베이스에 단순히 연결하는 것보다 시간이 많이 걸렸다는 것을 알았습니다.

세 번째 이유는 The Tear Down이 파괴적이지 않았기 때문입니다 (데이터베이스를 시작하는 시작). 즉, 데이터베이스에서 테스트중인 SQL을 실행하여 테스트가 실패한 이유를 해결할 수 있습니다.


업데이트: 20171115

이후 사용으로 전환했습니다 데이터베이스 서버의 실제 인스턴스를 시작하는 Junit 규칙 그리고 같은 것 FlywayDB 데이터베이스를 구축하고 데이터베이스를 구축 할 책임이있는 응용 프로그램과 함께 테스트와 동일한 스크립트를 사용하여 동일한 스크립트를 사용). 사전 제작 된 데이터베이스를 사용하는 것보다 훨씬 느립니다. 그러나 잘 정의 된 마이크로 서비스를 사용하여 테스트가 필요한 기능을 줄이고 테스트가 매우 엄격하게 해당 문제를 마이그레이션하고 항상 라이브와 일치하는 로컬 데이터베이스의 이점을 얻을 수 있습니다.

아쉽게도 테스트 중단이 항상 파괴적이지만 잘 배치 된 브레이크 포인트가이를 해결한다는 것을 의미합니다.

다른 팁

... 몇 년 후 지금 우리는 더 나은 옵션이 있습니다

Spring Boot/ Spring JDBC는 일반 JDBC로 데이터베이스를 초기화 할 수 있습니다.

Spring JDBC에는 DataSource 이니셜 라이저 기능이 있습니다. Spring Boot는 기본적으로 활성화하고 표준 위치에서 SQL을로드합니다. schema.sql 그리고 data.sql (클래스 경로의 근본에서). 또한 Spring Boot가로드됩니다 schema-${platform}.sql 그리고 data-${platform}.sql 플랫폼이 값인 파일 (현재) spring.datasource.platform, 예를 들어 데이터베이스의 공급 업체 이름 (HSQLDB, H2, Oracle, MySQL, PostgreSQL 등)으로 설정할 수 있습니다.

https://docs.spring.io/spring-boot/docs/current/reference/html/howto-database-initialization.html

제안 된 것처럼 표를 선불로 만드는 경우 여기 그리고 여전히 nosuchtableException을 얻는다면 스키마에 문제가 있습니다. 이제 미친 짓을하기 전에 모든 종류의 이상하고 멋진 방법으로 피해를 입히고 스키마 매개 변수를 설정하십시오. 공공의 당신이 만들 때 IDatabaseConnection, 그렇게 :

IDatabaseConnection databaseConnection = new HsqldbConnection(sqlConnection, "PUBLIC");

디버거와 함께 DBUNIT 코드를 밟는 것이 필요했지만 이것은 트릭을 수행하는 것 같습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top