6

私の単体テストでは、次のようなURLを使用するいくつかのデータソースを自動配線しました

jdbc:derby:memory:mydb;create=true

インメモリDBを作成します。

インメモリDerbydbをドロップするには、以下に接続する必要があります。

jdbc:derby:memory:mydb;drop=true

私はこれがすべてのテストの後に起こり、新しいデータベースから始めたいと思います。Springを使用してこれを行うにはどうすればよいですか?

4

6 に答える 6

5

Derbyインメモリデータベースを適切にシャットダウンする方法

私に解決策のヒントを与えました:

    mydb.drop.url = jdbc:derby:memory:mydb;drop=true

    ...

    <bean id="mydbDropUrl" class="java.lang.String">
    <constructor-arg value="${mydb.drop.url}" />
</bean>

    ...

    @Resource
private String mydbDropUrl;        

    @After
public void tearDown() {
    try {
        DriverManager.getConnection(mydbDropUrl);
    } catch (SQLException e) {
        // ignore
    }
}

欠点は、String(不変のStringオブジェクトの周りの不変のStringオブジェクト)を受け入れるStringコンストラクターを使用することです。Spring 3に@Valueアノテーションがあることを読みました。これはここで役立つかもしれませんが、Spring2.5を使用しています。

より良い解決策があれば教えてください。

于 2011-01-18T11:42:48.523 に答える
4

SpringをHibernateと一緒に使用している場合は、データベースに依存しない方法でこれを行うことができます。

すべてのテストメソッドの前/後に、アプリケーションコンテキストが作成/破棄されることを確認してください。

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"classpath*:application-context-test.xml"})
@TestExecutionListeners({DirtiesContextTestExecutionListener.class, 
    DependencyInjectionTestExecutionListener.class})
@DirtiesContext(classMode = ClassMode.AFTER_EACH_TEST_METHOD)
public abstract class AbstractTest {

}

起動時にスキーマを自動作成し、シャットダウン時にスキーマを削除するようにHibernateに指示します。

hibernate.hbm2ddl.auto = create-drop

今、すべてのテストの前に

  • アプリケーションコンテキストが作成され、必要なSpring Beanが注入されます(spring)
  • データベース構造が作成されます(休止状態)
  • import.sqlが存在する場合は実行されます(休止状態)

そしてすべてのテストの後

  • アプリケーションコンテキストが破棄されます(春)
  • データベーススキーマは削除されます(休止状態)。

トランザクションを使用している場合は、を追加することをお勧めしますTransactionalTestExecutionListener

于 2012-05-11T11:36:27.587 に答える
2

春のテスト3の後、アノテーションを使用して構成を挿入できます。

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("/spring-test.xml")
public class MyTest {
}
于 2011-12-16T08:27:30.303 に答える
1

spring-test.jarライブラリを使用する場合は、次のように実行できます。

public class MyDataSourceSpringTest extends
AbstractTransactionalDataSourceSpringContextTests {

    @Override
    protected String[] getConfigLocations() {
        return new String[]{"classpath:test-context.xml"};
    }

    @Override
    protected void onSetUpInTransaction() throws Exception {
        super.deleteFromTables(new String[]{"myTable"});
        super.executeSqlScript("file:db/load_data.sql", true);
    }
}

そして、最新のコメントに基づいて更新されたバージョンで、すべてのテストの前にdbを削除し、テーブルを再作成します。

public class MyDataSourceSpringTest extends
    AbstractTransactionalDataSourceSpringContextTests {

        @Override
        protected String[] getConfigLocations() {
            return new String[]{"classpath:test-context.xml"};
        }

        @Override
        protected void onSetUpInTransaction() throws Exception {
            super.executeSqlScript("file:db/recreate_tables.sql", true);
        }
}
于 2011-01-17T21:14:46.493 に答える
1

次のようなことをしてください。

public class DatabaseTest implements ApplicationContextAware {
    private ApplicationContext context;
    private DataSource source;

    public void setApplicationContext(ApplicationContext applicationContext) {
        this.context = applicationContext;
    }

    @Before
    public void before() {
        source = (DataSource) dataSource.getBean("dataSource", DataSource.class);
    }

    @After
    public void after() {
        source = null;
    }
}

Beanにプロトタイプのスコープを持たせます(scope="prototype")。これにより、すべてのテストの前にデータソースの新しいインスタンスが取得されます。

于 2011-01-17T22:23:46.040 に答える
0

これは、すべてのテストの開始時に行うことです。

  1. 以前のオブジェクトをすべて削除します。

  2. create_table.sqlに記載されているすべてのテーブルを作成します

  3. テストする内容に基づいて、作成したテーブルに値を挿入します。

      @Before
      public void initialInMemoryDatabase() throws IOException, FileNotFoundException {
    
      inMemoryDerbyDatabase.dropAllObjects();
      inMemoryDerbyDatabase.executeSqlFile("/create_table_policy_version_manager.sql");
      inMemoryDerbyDatabase.executeSqlFile("/insert_table_policy_version_manager.sql");
    
      }
    

チャームのように機能します!

于 2016-05-06T19:55:34.090 に答える