2016-07-14 28 views
1

私は以下のようにDAOで1つのアプリケーションを持っています。私はこのクラスをjunitしたい。私のクラスはこのように見えます。私はmockitoから例外を以下の取得このテストケースを実行するとSpring jdbcTemplate Junit

public class DaoImpl implements Dao{ 

    @Override 
    public User getUserInfo(String userid) { 
     return getTemplate().queryForObject(QUERY, new Object[] { userid }, 
       new BeanPropertyRowMapper<User>(User.class)); 
    } 

    } 

私のJUnitのクラスは、この

@RunWith(SpringJUnit4ClassRunner.class) 
public class DaoImplTests{ 

    @Autowired 
    private Dao dao; 

    @Mock 
    JdbcTemplate jdbcTemplate; 

    @Test 
    public void testUsingMockito() { 
     try { 
      User mockedUserInfo = new User(); 
      //setters 
      mockedUserInfo.setXXX; 
      mockedUserInfo.setYYY; 

      Mockito.when(((JdbcDaoSupport)dao.getTemplate())).thenReturn(jdbcTemplate); 
      Mockito.when(jdbcTemplate.queryForObject(Mockito.anyString(), Mockito.any(Object[].class), 
        Mockito.any(RowMapper.class))).thenReturn(mockedUserInfo); 
      User userInfo = dao.getUserInfo(""); 
      Assert.assertNotNull(userInfo); 
      Assert.assertEquals(mockedUserInfo.getXXX(), userInfo.getXXX()); 
      //few more assertions 
     } catch (Exception e) { 
      Assert.fail(" : " + e.getMessage()); 
     } 
    } 

} 

のように見えます。

org.mockito.exceptions.misusing.MissingMethodInvocationException: 
when() requires an argument which has to be 'a method call on a mock'. 
For example: 
    when(mock.getArticles()).thenReturn(articles); 

Also, this error might show up because: 
1. you stub either of: final/private/equals()/hashCode() methods. 
    Those methods *cannot* be stubbed/verified. 
2. inside when() you don't call method on mock but on some other object. 
3. the parent of the mocked class is not public. 
    It is a limitation of the mock engine. 

マイクエリ:

  1. 私のクラス
  2. getJdbcTemplateが最終JdbcDaoSupportクラスであるため、この例外が来ているのJUnitする方法。このアプローチの代替手段はありますか?

私はポストSpring jdbcTemplate unit testing

を使用して、私のJUnitを書きました。しかし、それは動作しませんように見えます。

+1

メモリデータベースなどのデータソースをモックして、 'JdbcTemplate'をモックしないでください –

+0

データベースが非常に複雑で大きなものであるため、嘲笑データベースは私にとってはオプションのようです。 – Javadroider

+0

DAOをテストするときは、データベースをモックしないでください。この種のテストは、統合テストであり、データベースはバックで実行されます。ここをクリックしてください[データアクセス層のテスト方法](http://programmers.stackexchange.com/questions/219362/how-to-test-the-data-access-layer) – cheffe

答えて

0

あなたの問題は、この行である:それは嘲笑対象ではありませんので、あなたはDAO @Autowiredで注釈されている

Mockito.when(((JdbcDaoSupport)dao.getTemplate())).thenReturn(jdbcTemplate); 

。おそらく何をしたいのですか?SpringTestReflectionUtilsを使用して、daoのjdbcTemplateをあなたの模擬オブジェクトに設定します。

関連する問題