首页 > 解决方案 > anyString() 为 null 而不是空字符串

问题描述

我正在尝试测试我的 dao,但是当我通过 anyString() 时,在我的 dao 中它以空字符串的形式出现,因此,它没有返回我想要的模拟对象

@InjectMocks
private Dao dao;

@Mock
@Qualifier("jdbcTemp")
private JdbcTemplate jdbcTemp;

@Test
public void testGetData() {
    List<MyObj> list = new ArrayList<>();
    MyObj myObj = new MyObj();
    myObj.setMethod("method val");
    list.add(myobj);

    Mockito.when(jdbcTemp.query(anyString(), Mockito.any(PreparedStatementSetter.class),
        Mockito.any(Dao.MyRowMapper.class))).thenReturn(list);

    List<MyObj> res = dao.getData(param1, param2); // this is empty, instead of having a value of 1

    Assertions.assertThat(res).isNotNull();
}

我的道

@Autowired
private String query;

@Autowired
private JdbcTemplate jdbcTemp;

public List<MyObj> getData(String arg1, String arg2) {
    List<MyObj> list = new ArrayList<MyObj>();

    try {
        // query below is null instead of empty string
        list.addAll(jdbcTemp.query(query, new PreparedStatementSetter() {
            public void setValues(PreparedStatement pstmt) throws SQLException {
                pstmt.setString(PARAM_ONE, arg1);
                pstmt.setString(PARAM_TWO, arg2);
            }
        }, new MyRowMapper()));
    } catch (Exception exp) {
    
}

return list;

}

标签: javamockito

解决方案


因此,正如您正确提到anyString()的,仅匹配非空字符串。当你传入query你的方法时,你应该验证你的 autowiredquery不为空。作为替代方案,您可以坚持any()nullable(String.class)匹配 null。由于您的测试不依赖于query您可以安全地使用它的值。

但是,由于您的代码没有显示您的注入是如何工作的,我们无法进一步调查您的问题。如果您有必要这样做,请添加相关的代码部分。


推荐阅读