2016-07-14 6 views
1

다음과 같이 DAO가있는 응용 프로그램이 하나 있습니다. 나는이 수업을 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을 조롱 된 객체로 설정할 수 있습니다.

관련 문제