2016-07-14 28 views
1

Ich habe eine Anwendung mit DAO wie folgt. Ich möchte diesen Kurs abschliessen. Meine Klasse sieht so aus.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)); 
    } 

    } 

Meine junit Klasse sieht wie folgt aus

@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()); 
     } 
    } 

} 

Wenn ich diesen Testfall ausführen ich Ausnahme von Mockito folgende erhalten.

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. 

Meine Anfragen:

  1. Wie meine Klasse JUnit
  2. Diese Ausnahme kommt, weil getJdbcTemplate letzte JdbcDaoSupport Klasse. Gibt es eine Alternative für diesen Ansatz?

Ich schrieb meine junit mit Post Spring jdbcTemplate unit testing

Aber, sieht aus wie es nicht funktioniert.

+1

Mock 'JdbcTemplate' nicht vortäuschen, verspotten Sie die Datenquelle, mit zum Beispiel einer in der Speicherdatenbank –

+0

Mocking Datenbank scheint keine Option für mich als Datenbank ist sehr komplex und groß. – Javadroider

+0

Wenn Sie ein DAO testen, sollten Sie die Datenbank nicht mockern. Diese Art von Test sollte Integrationstests mit einer Datenbank sein, die auf der Rückseite ausgeführt wird. Lesen Sie hier [Wie testet man die Datenzugriffsschicht?] (Http://programmers.stackexchange.com/questions/219362/how-to-test-the-data-access-layer) – cheffe

Antwort

0

Sie Problem ist mit dieser Zeile:

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

Sie haben dao mit @Autowired kommentierte, damit es nicht ein verspottet Objekt ist. Wahrscheinlich möchten Sie SpringTestReflectionUtils verwenden, um Ihre jdbcTemplate im Dao auf Ihr mockiges Objekt zu setzen.