38

Spring 3.1.1.RELEASE、Hibernate 4.1.0.Final、JPA 2、JUnit 4.8.1、および HSQL 2.2.7 を使用しています。サービス メソッドでいくつかの JUnit テストを実行したいと考えています。各テストの後、インメモリ データベースに書き込まれたデータをロールバックしたいと考えています。ただし、テスト全体をトランザクションとして扱いたくありません。たとえば、このテストでは

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({ "classpath:test-context.xml" })
public class ContractServiceTest 
{
    …

    @Autowired
    private ContractService m_contractService;

    @Test
    public void testUpdateContract()
    {
        // Add the contract
        m_contractService.save(m_contract);
        Assert.assertNotNull(m_contract.getId());
        // Update the activation date by 6 months.
        final Calendar activationDate = Calendar.getInstance();
        activationDate.setTime(activationDate.getTime());
        activationDate.add(Calendar.MONTH, 6);
        m_contract.setActivationDate(activationDate.getTime());
        m_contractService.save(m_contract);
        final List<Contract> foundContracts = m_contractService.findContractByOppId(m_contract.getOpportunityId());
        Assert.assertEquals(foundContracts.get(0), m_contract);
    }   // testUpdateContract

サービスへの 3 つの呼び出し (「m_contractService.save」、「m_contractService.save」、「m_contractService.findContractByOppId」) があり、それぞれがトランザクションとして扱われます。しかし、各単体テストの後にメモリ内データベースを元の状態にリセットする方法がわかりません。

追加情報を提供する必要がある場合はお知らせください。

4

7 に答える 7

30

Hibernate を使用しているため、プロパティを使用hibernate.hbm2ddl.autoして起動時に毎回データベースを作成できます。また、各テストの後にスプリング コンテキストを強制的にリロードする必要があります。@DirtiesContext注釈を使用してこれを行うことができます。

これにより、テストのオーバーヘッドが少し増える可能性があるため、他の解決策は、各テーブルからデータを手動で削除することです。

于 2013-01-16T00:38:41.623 に答える
1

@Beforeデータベースからすべてのデータを削除するメソッドを作成します。Hibernate を使用しているため、HQL: を使用できますdelete from Contract

于 2013-01-16T09:21:46.303 に答える