NullPointerException для NamedParameterJdbcTemplate источника mockito - PullRequest
0 голосов
/ 28 апреля 2020

у меня есть класс DAO, который я пытаюсь написать тестовые случаи

Вот модифицированный воспроизводимый код

класс DAO, который я пытаюсь проверить


@Component
public class SomeDAO {

    @Autowired
    private NamedParameterJdbcTemplate namedParameterJdbcTemplate;


    public boolean dataInTable(String id) {
        String sql = "SELECT COUNT(*) " +
                "FROM table1" +
                "WHERE id =:id";



        MapSqlParameterSource sqlParms = new MapSqlParameterSource();
        sqlParms.addValue("id", id

        try {
            int count = namedParameterJdbcTemplate.queryForObject(sql, sqlParms, Integer.class);
            return (count > 0) ? true : false;

        } catch (Exception e) {
            log.error("Error checking existence of id : " + id);
            throw e;
        }
    }

}

Когда я запускаю тест, он выдает NullPointer на

int count = namedParameterJdbcTemplate.queryForObject(sql, sqlParms, Integer.class);

, поэтому я считаю, что mockito не возвращает значение когда, затем Return

я искал вокруг переполнения стека, и это похоже на то, что я должно работать, но я получаю NullPointerException.

Я также пытался использовать то же значение для sql строки и mapObject в качестве класса dao вместо anyString () и anyMap ()

но не сработало

Контрольный пример

@RunWith(MockitoJUnitRunner.class)
public class SomeDAOTest {

    @InjectMocks
    SomeDAO someDao

    @Mock
    NamedParameterJdbcTemplate namedParameterJdbcTemplate;


    @Before
    public void init() {
        MockitoAnnotations.initMocks(this);

    }

    @Test
    public void TestdataInTable(){

        //
        when(namedParameterJdbcTemplate.queryForObject(anyString(), anyMap(),eq(Integer.class))).thenReturn(1);
        assertEquals( true,someDao.dataInTable("123456"));
    }

}

1 Ответ

1 голос
/ 28 апреля 2020

Попробуйте,

@Test
  public void TestdataInTable() {

    Mockito.when(namedParameterJdbcTemplate.queryForObject(Mockito.anyString(),
        Mockito.any(SqlParameterSource.class), Mockito.eq(Integer.class))).thenReturn(1);
    assertEquals(true, someDao.dataInTable("123456"));
  }
  1. Второй параметр в queryForObject () имеет тип SqlParameterSource, который не является непосредственно картой. Так и должно быть, Mockito.any (SqlParameterSource.class).

Текущая версия вашего кода отображает предупреждение в консоли, что является лучшим способом решения проблемы.

[MockitoHint] TestDao.TestdataInTable (see javadoc for MockitoHint):
[MockitoHint] 1. Unused... -> at TestDao.TestdataInTable(TestDao.java:33)
[MockitoHint]  ...args ok? -> at SomeDao.dataInTable(SomeDao.java:26)
...