2

私は次の構造を持っています:

public class MyDao{

private JdbcTemplate  jdbcTemplate;
private DataSource dataSource;


public DataSource getDataSource() {
    return dataSource;
}


public void setDataSource(DataSource dataSource) {
    this.dataSource = dataSource;
}

public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

    public VCASDao(DataSource dataSource ){
        jdbcTemplate = new JdbcTemplate(dataSource);
    }
}

一部のマネージャークラス

 public class MyManager{

MyDao dao = null;
private DataSource dataSource;

public MyManager(){}

    public DataSource getDataSource() {
        return dataSource;
    }

    public void setDataSource(DataSource dataSource) {
        this.dataSource = dataSource;
    } 

   public void someMethod(Object o){
      dao.save(o);
   }
   }
}

とファサードクラス

public class MyFacadeClass{

private MyManager manager;

public MyFacadeClass(){
 manager = new MyManager();
}

public void someFacadeMethod(Object o){
 manager.someMethod(o);
}

}

それでは、JUnitとMockitoでテストしたいと思います。私の問題は、JNDIスキーマがなく、HSQLDBに基づくDataSourceを使用してJdbcTemplateをモックする必要があることです。

私のモックは次のようになります。

@Mock
static BasicDataSource dataSource ;

@Mock
static JdbcTemplate jdbcTemplate ;

@Mock 
MyDao dao;

MyFacadeClass myFacadeClass = new MyFacadeClass();

    @BeforeClass
    public static void init(){
          dataSource = new BasicDataSource();
      dataSource.setDriverClassName("org.hsqldb.jdbcDriver");
          dataSource.setUrl("jdbc:hsqldb:mem:Test");
          dataSource.setUsername("sa");
          dataSource.setPassword("");
          dataSource.setInitialSize(5);
          dataSource.setMaxActive(10);
          dataSource.setPoolPreparedStatements(true);
          dataSource.setMaxOpenPreparedStatements(10);
          jdbcTemplate = new JdbcTemplate(dataSource);
          jdbcTemplate
          .execute("create Some Table");
    }


@Test
public void testSomeFacadeMethod(){
Object o = new Object();
myFacadeClass.someFacadeMethod(o);
}

MyManagerコンストラクタで、「some_DB」のJNDI名が存在しないという例外が発生します。

モックの一般的なアプローチに問題があると思います。助けてください。

PS:このプロジェクトではSpringを使用していません。コードを単純化するために、JdbcTemplateクラスを使用しています。

アップデート:

クラスを変更しましたが、daoオブジェクトがnullになりました。

4

2 に答える 2

5

あなたが投稿したものから、私はあなたがテストしたいことを収集しますMyFacadeClass。それが実際に当てはまる場合は、ここで間違ったものをモックしていることになります。

唯一の興味深い関係はMyFacadeClass->MyManagerです。JNDIとJdbcTemplateは表示されませんがMyFacadeClass、なぜテストに表示されるのでしょうか;)

同じアーキテクチャを維持しながら、私が進む方向は次のとおりです。

  1. したがって、では、MyFacadeClassTestモックMyManagerとインジェクションのみMyFacadeClassを行い、関連するシナリオをテストする必要があります。

  2. ではMyManager、JNDIのものをテストしないことをお勧めします。たとえば、MyDaoオブジェクトを直接受け取るパッケージ可視コンストラクターを作成できます。このJNDIのものを別のクラスで外部化する方がさらに良いでしょう。それはのようなものかもしれませんMyDaoProvider。次に、とモックMyManagerTestの間の関連する相互作用をテストします。MyManagerMyDao

  3. 最後にMyDao、DAOは実際のデータベースでのみ正しくテストできるため、テストする必要があります。これは、実行するために別のシステムが必要になることを意味します。このテストは統合テストです。実際のDB(Oracleなど)またはメモリ内のDB(HSQLDBなど)に対して実行します。この場合、テスト環境に応じて実際のJdbcTemplateを作成し、DAOに挿入します。 。また、これらのテストをまったく実行することはできません。代わりに、ビジネス受け入れテストを実行します。

お役に立てば幸いです。

于 2012-06-14T13:03:13.103 に答える
1

MyManagerデータソースを検索しないでください。データソースを注入する必要があります。これがDependency Injection原則です。独自の実装(この場合は独自のデータソース)を簡単に組み込むことができるため、テストが容易になります。

もう1つのオプションはgetDataSource()、クラスにメソッドを追加してからMyManager、それをモックすることです。

于 2012-06-14T12:02:35.393 に答える