anyString () é nulo em vez de string vazia

Sep 04 2020

Estou tentando testar meu dao, no entanto, quando passo anyString (), no meu dao está saindo como uma string nula e, como resultado, não está retornando meu objeto simulado que desejo

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

Meu Dao

@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;

}

Respostas

Campingenieur Sep 04 2020 at 14:55

Como você mencionou corretamente anyString(), só corresponde a Strings não nulas. e conforme você passa querypara o seu método, você deve verificar se o seu autowired querynão é nulo. Como alternativa, você pode seguir any()ou nullable(String.class)que corresponde a nulo. Como seu teste não depende do queryvalor, você pode usá-lo com segurança.

No entanto, como seu código não mostra como sua injeção funciona, não é possível investigarmos seu problema. Se isso for necessário para você, adicione as partes relevantes do código.