2017-04-05 91 views
0

所以我一直停留在這個問題上一整天。Jmockit /春嘲笑的依賴仍然調用真正的依賴

我在Spring 3.2測試類類型JdbcSupportDao的。如果您只是閱讀代碼,問題是非常明顯的,但我將簡要總結一下:

我在JdbcTemplate上使用@Mocked註釋來模擬查詢數據庫。問題是,寫的期望塊後,實際的JdbcTemplate方法仍然被稱爲與JMockit顯然不是公式進入的。

下面的單元測試失敗:

/*@RunWith(SpringJUnit4ClassRunner.class)*/ 
@RunWith(JMockit.class) 
@ContextConfiguration(locations={"classpath:studentAggregateReport-servlet.xml", "classpath:applicationContext-hibernate.xml"}) 
public class JdbcSSODaoTest extends AbstractTransactionalJUnit4SpringContextTests { 

    @Mocked 
    JdbcTemplate jdbcTemplate; 

    List<String> unameList; 


    SSODao ssoDao; 

    String DUMMY_ALCID = "yattayattayatta"; 

    @Before 
    public void constructDao() { 
     this.ssoDao = new JdbcSSODao(); 
     ((JdbcSSODao) ssoDao).setJdbcTemplate(jdbcTemplate); 
    } 

    @Test 
    public void testGetUnameFromAlcId() { 
     unameList = new ArrayList<String>() {{ 
      add("PEEPEE"); 
     }}; 
     //((JdbcSSODao) ssoDao).setJdbcTemplate(jdbcTemplate); 
     new Expectations() {{ 
      jdbcTemplate.query(anyString, (ResultSetExtractor<String>)any); result = unameList; 
     }}; 

     String uname = ssoDao.getUnameFromAlcId(DUMMY_ALCID); 

     assertNotNull(uname); 
    } 

} 

,這裏是正在測試的類代碼:

public class JdbcSSODao extends JdbcDaoSupport implements SSODao { 

    @Override 
    public String getUnameFromAlcId(String alcid) { 
     String sql = SSOSqlUtil.createGetUnameByAlcIdSql(alcid); 
     logger.debug(sql); 
     List<String> resultLst = getJdbcTemplate().query(sql, new RowMapper<String>() { 
      public String mapRow(ResultSet rs, int rowNum) throws SQLException { 
       return rs.getString(1); 
      } 
     }); 
     if(resultLst.isEmpty()) return null; 
     return resultLst.get(0); 
    } 

} 

請幫神:(

回答

0

甜媽..

顯然,你要投的嘲笑方法的參數,以在日使用的確切類型電話。這個固定爲我:

new Expectations() {{ 
     jdbcTemplate.query(anyString, (RowMapper<String>)any); result = unameList; 
    }};