2013-12-17 59 views
1

我正在使用JMockit测试Spring JDBC类。 以下是测试类:使用JMUnit4测试Spring JDBC与JUnit4

公共类DAOImplTest {

@Tested 
DAOImpl daoImpl; 

@Mocked 
JdbcTemplate mockJdbcTemplate; 

@Before 
public void setup() throws Exception{ 
    daoImpl = new DAOImpl(); 
    daoImpl.setJdbcTempate(mockJdbcTemplate); 
} 

@Test 
public void testGetSomeString() throws Exception{ 
    final String expectedO = "7c82facc"; 
    final String expectedG = "one"; 

    new Expectations() {{ 
     mockJdbcTemplate.queryForObject(SSODAOImpl.GET_IDS, String.class, expectedO); 
     result = expectedG; 
    }}; 

    DAOImpl daoImpl = new DAOImpl(); 
    String actual = daoImpl.getSomeString(expectedO); 
    assertEquals(expected, actualG); 
} 

}

类抛出空指针异常就行String actual = daoImpl.getSomeString(expectedO)

什么是用于获取空指针异常的原因在这一点上?

以下是DAOImpl类方法:

public String getSomeString(String or) { 
DAORowMapper rowMapper = new DAORowMapper(); 
      String g = jdbcTemplate.queryForObject(GET_IDS, rowMapper, orgIds); 
      return g; 
} 

这里是堆栈跟踪在运行JUnit 4测试。同样,空指针异常运行Junit4测试用例

java.lang.NullPointerException 
    at com.DAOImpl.getSomeString(DAOImpl.java:31) 
    at comDAOImplTest.testGetSomeString(DAOImplTest.java:45) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:597) 

回答

1

好像问题是内getSomeString()jdbcTemplatenull时。

DAOImpl daoImpl = new DAOImpl(); 

这个局部变量没有按:这是因为当你在setup()方法设置在daoImpl场这一领域,你是不是使用daoImpl场....你是一个局部变量这里阴影场没有将jdbcTemplate字段设置为模拟对象。删除该行,我认为它会起作用。

+0

如果我删除DAOImpl daoImpl = new DAOImpl();我收到以下错误! – Thunder

+0

java.lang.AssertionError:意外的调用: Object org.springframework.jdbc.core.JdbcTemplate#queryForObject(String,org.springframework.jdbc.core.RowMapper,Object []) 实例:org.springframework.jdbc .core.JdbcTemplate @ 5ff06dc3 删除DAOImpl daoImpl = new DAOImpl();得到那个错误 – Thunder

+0

杰夫的答案是正确的。调用“@Tested daoImpl”对象时出现的“意外调用”仅仅是因为'mockJdbcTemplate'上记录的严格期望不匹配;相反,检测到具有不同参数的(意外的)调用。所以,你可能需要调整记录的期望值。你可能更喜欢使用非严格的期望值(即'new NonStrictExpectations(){{...}}' –