2

SimpleJdbcDaoSupport を拡張するクラスが与えられた場合、SimpleJdbcTemplate をどのようにモックできますか?

public class SimpleJdbcDaoSupportExtension extends SimpleJdbcDaoSupport {  
     public SimpleJdbcDaoSupportExtension (JdbcTemplate jdbcTemplate){  
             super.setJdbcTemplate(jdbcTemplate);  
     }

     public MyDomainObj getResult(){
         SimpleJdbcTemplate sjdbc = getSimpleJdbcTemplate();  
         MyDomainObj result = sjdbc.query(*whatever necessary args*.);
         return result;
     }
}

次に、Mockito を使用します。

public class Test {  
    @Mock private JdbcTemplate mockedJdbcTemplateDedendency;  
    private SimpleJdbcDaoSupportExtension testObj;  

    @Before
    public void doBeforeEachTestCase() {
        MockitoAnnotations.initMocks(this);
        SimpleJdbcDaoSupportExtension sje = new SimpleJdbcDaoSupportExtension (mockedJdbcTemplateDedendency);
    }  
    @Test
    public final void test(){           
        when(mockedJdbcTemplateDedendency.query("what to query").thenReturn(new MyDomainObj());
    }
}

モックされた JdbcTemplate が注入されますが、dao クラスは SimpleJdbcTemplate に依存してクエリを作成し (オブジェクトへのマッピング用)、SimpleJdbcDaoSupport によって内部的に構築されるため、JdcbTemplate をモックしても SimpleJdbcTemplate には影響しません。パブリック セッターがなく、SimpleJdbcTemplate を信頼する唯一の方法は、そのメソッド getSimpleJdbcObject() に依存することです。

4

4 に答える 4

3

具象クラスをモックする代わりに、インターフェース(必要なメソッドを持っている)をモックする必要があります。

例えば:

public class SimpleJdbcDaoSupportExtension extends SimpleJdbcDaoSupport implements MyDomainDao{  
     public SimpleJdbcDaoSupportExtension (JdbcTemplate jdbcTemplate){  
             super.setJdbcTemplate(jdbcTemplate);  
     }

     public MyDomainObj getResult(){
         SimpleJdbcTemplate sjdbc = getSimpleJdbcTemplate();  
         MyDomainObj result = sjdbc.query(*whatever necessary args*.);
         return result;
     }
}

public class Test {  
    @Mock private MyDomainDao myDomainDao ;
    private YourController yourController;  

    @Before
    public void doBeforeEachTestCase() {
        MockitoAnnotations.initMocks(this);
        yourController = new YourController(myDomainDao);
    }  
    @Test
    public final void testSomething(){           
        when(myDomainDao.getResult().thenReturn(new MyDomainObj());
        //on to testing the usages of myDomainDao
        yourController.doSomething();
        //verify
        verify(myDomainDao, times(2)).getResult();
    }
}
于 2011-02-15T09:26:16.180 に答える
0

後もう一つ。SimpleJdbcTemplateJdbcTemplateに置き換えることで、この問題を解決しました。私はJavaに慣れておらず、.Netの世界から乗り越えており、当初はSimpleJdbcTemplateを使用していました。これは、Javaの使用法を説明するドキュメントに出くわしたため、ニーズに完全に応えました。しかし、Skaffmanのコメントにより、私はJdbcTemplateをより深く調査するようになり、 SimpleJdbcTemplateは本当に必要ないことに気づきました。
それにもかかわらず、問題の哲学的な部分はまだ残っています。コンテナ自体に尋ねることによってのみ作成できるものをどのようにモックしますか?Springは、コンテナーに厳密に依存することにより、ここでDIの原則に違反しているように思われます。

于 2011-02-13T06:03:02.250 に答える
0

なぜJdbcTemplateをモックするのですか? HSQL のようなインメモリ データベースで本物を使用します。

于 2011-02-12T10:47:25.447 に答える