17

DAOの機能をチェックするためにJUnitテストを実装しようとしています。(DAO は、基本的なオブジェクト/テーブルの関係を作成/読み取ります)。

私が抱えている問題は、 Spring/Hibernateを使用した社内ソリューションによって DAO (非テスト コード用) の永続化が完了していることです。これにより、私が見つけたほとんどの例に含まれる通常の*.hbm.xmlテンプレートが排除されます。

このため、 JUnitテストをセットアップして DAO を実装し、インメモリHSQLDBを作成/読み取り (非常に基本的な機能)する方法を理解するのに苦労しています。いくつかの例を見つけましたが、社内永続化の使用は、例が示すクラスの一部を拡張できないことを意味します (application-context.xml セットアップを適切に取得できないようです)。

このテスト機能を実装するための最良の方法の理解を深めるために、私が見ることができるプロジェクト/例 (またはドキュメント) を誰かが提案できますか? これは本当に単純なはずだと思いますが、見つけた例を実装する際に問題が発生し続けています。

編集:

物事を進めるのに手を必要とする人のために、読みやすくするための私の解決策は次のとおりです。

  • 私のTestClass

    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(locations = "classpath:applicationContextTest-Example.xml")
    @Transactional
    public class ExampleDaoTest extends AbstractTransactionalJUnit4SpringContextTests {
        @Resource(name = "sessionFactory")
        private SessionFactory exampleSessionFactory;
    
        @Resource(name = "exampleDao")
        private ExampleDao exampleDao;
    
  • 私のapplicationContext.xmlファイル:

    <!-- List of Daos to be tested -->
    <bean id="exampleDao" class="org.myExample.ExampleDao"/>
    
    <!-- Datasource -->
    <bean id="example_dataSource"
          class="org.apache.commons.dbcp.BasicDataSource">
        <property name="driverClassName" value="org.hsqldb.jdbcDriver"/>
        <property name="url" value="jdbc:hsqldb:mem:ExampleTest"/>
        <property name="username" value="sa"/>
        <property name="password" value=""/>
    </bean>
    
    <!-- Session Factory -->
    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
        <property name="dataSource" ref="example_dataSource"/>
        <property name="annotatedClasses">
            <list>
                <value>org.myExample.ExampleClass</value>
            </list>
        </property>
        <property name="hibernateProperties">
            .... left to user to choose properties
        </property>
    </bean>
    
4

5 に答える 5

5

Spring 3は、jdbcHSQLDBを含む組み込みデータベースのサポートを含む新しい名前空間を提供します。だから、それはその部分の世話をします。

「社内ソリューション」とは何か疑問に思っています。アノテーション(JPAまたはHibernateアノテーションのいずれか)を使用してドメインオブジェクトをORMできるのに、なぜ「社内ソリューション」が必要なのですか?例えば:

<bean id="sessionFactory"
    class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"
    p:dataSource-ref="dataSource"
    p:packagesToScan="myapp.model" />

テストの実装に関しては、SpringのTestContextFrameworkを使用してください。テストは次のようになります(ここでも、以下のSpring 3を想定していますが、@Injectを@Autowiredに変更するだけでSpring2.5で機能するはずです)。

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({
    "/beans-datasource-it.xml",
    "/beans-dao.xml",
    "/beans-service.xml",
    "/beans-web.xml" })
@Transactional
public class ContactControllerIT {
    @Inject private ContactController controller;

    ... setUp() and tearDown() ...

    @Test
    public void testGetContact() {
        String viewName = controller.getContact(request, 1L, model);

        ... assertions ...
    }
}

beans-datasource-it.xmlたとえば、組み込みデータベースを内部に配置します。(ここでの「it」は統合テストを表し、ファイルはクラスパス上にあります。)この例のコントローラーはbeans-web.xmlにあり、フィールドに自動配線されContactControllerます。

これは何をすべきかの概要にすぎませんが、うまくいけば、始めるのに十分です。

于 2010-05-19T04:39:22.640 に答える
2

最近、HibernateSpring、およびHSQLDB を使用して、コードの一部に同様のソリューションを実装しました。

現在は非推奨になっていることは注目に値しAbstractTransactionalJUnit4SpringContextTests ますが、テストはまだかなり簡単です。ここでほとんどの詳細を説明します。 -with.html

于 2011-05-22T13:19:35.730 に答える
2

ここ を参照してください。ビルドツールとしてmaven2を想定していますが、なんでも簡単に使えます。

于 2010-05-19T04:22:16.777 に答える
1

Hibernateの要点は、SessionFactory-社内ソリューションはおそらくこれらのいずれかを何らかの方法で作成することです。方法を確認してから、同じ方法で(または、可能であれば実行時に使用される社内コードを使用して)テストアプリコンテキストでBeanを作成するためのBeanを追加します。インスタンス化を行うには、独自のFactoryBeanを作成する必要がある場合があります。(基本クラスとしてAbstractFactoryBeanを使用します。)

これが適切に行われると、LocalSessionFactoryBeanを使用するほとんどの例を状況に移行できます。LocalsessionFactoryBeanを使用する代わりに、カスタムファクトリBeanを使用します。

(まだ行っていない場合は、Springリファレンスの「テスト」セクションを参照してください。Springを使用したテストと、コンテキストからのBeanを使用したテストの注入が簡単になります。)

于 2010-05-18T23:30:20.513 に答える
0

私のアプリケーション コンテキストは少し異なって見えます

<beans:bean class="org.apache.commons.dbcp.BasicDataSource" id="HSQL_DS">
    <beans:property name="driverClassName" value="org.hsqldb.jdbcDriver"/>
    <beans:property name="url" value="jdbc:hsqldb:mem:Test"/>
    <beans:property name="username" value="sa"/>
    <beans:property name="password" value=""/>
</beans:bean>
<jdbc:embedded-database id="HSQL_DS">
    <jdbc:script location="classpath:schema.sql"/>
    <jdbc:script location="classpath:data.sql"/>
</jdbc:embedded-database>

私のテストクラスは次のようになります。

public class Tester {

    private EmbeddedDatabase db;

    @Before
     public void setUp(){
        db = new EmbeddedDatabaseBuilder().addDefaultScripts().build();


    }

    @Test
    public void TestMe(){
        System.out.println("Testing");
    }


    @After
    public void tearDown(){

        db.shutdown();
    }
}
于 2013-07-03T00:10:03.653 に答える