【问题标题】:Testing Spring JDBC with JMockit with JUnit4使用 JMockit 和 JUnit4 测试 Spring JDBC
【发布时间】:2013-12-17 22:04:15
【问题描述】:

我正在使用 JMockit 测试一个 Spring JDBC 类。 以下是测试类:

公共类 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) 线上抛出 NullPointer 异常

此时出现空指针异常的原因是什么?

以下是DAOImpl类方法:

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

这是运行 JUnit 4 测试时的堆栈跟踪。 NullPointer 异常再次出现在运行 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)

【问题讨论】:

    标签: java spring junit4 jmockit


    【解决方案1】:

    似乎问题在于getSomeString() 内的jdbcTemplate 字段是null。这是因为当您在 setup() 方法中的 daoImpl 字段上设置此字段时,您没有使用 daoImpl 字段....您在此处使用局部变量来隐藏该字段:

    DAOImpl daoImpl = new DAOImpl();
    

    此局部变量没有将jdbcTemplate 字段设置为模拟对象。删除该行,我认为它会起作用。

    【讨论】:

    • 如果我删除 DAOImpl daoImpl = new DAOImpl();我收到以下错误!
    • java.lang.AssertionError: 在实例上意外调用:对象 org.springframework.jdbc.core.JdbcTemplate#queryForObject(String, org.springframework.jdbc.core.RowMapper, Object[]): org.springframework.jdbc.core.JdbcTemplate@5ff06dc3 删除 DAOImpl daoImpl = new DAOImpl();得到那个错误
    • 杰夫的回答是正确的。调用@Tested daoImpl 对象时得到的“意外调用”仅仅是因为mockJdbcTemplate 上记录的严格期望不匹配;相反,检测到具有不同参数的(意外)调用。因此,您可能需要调整记录的期望值。您可能还更喜欢使用非严格的期望值(即new NonStrictExpectations() {{ ... }}
    • 他是对的。它对我有用的方式是删除 daoImpl 的实例。使用 @Before 删除新的实例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-06
    • 1970-01-01
    • 2012-10-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多