私は次の構造を持っています:
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になりました。