如何模拟RowMapper?

时间:2016-09-20 00:17:38

标签: java unit-testing junit

我试图嘲笑这个dao并且我得到了一个N​​PE。我不确定我是不是在嘲笑某些东西,或者我是否使用了不恰当的东西。我在下面有这个道具:

@Repository
public class PersonDaoImpl extends AbstractDao implements PersonDao {

    private static final String SQL = "select * from personTable";
    @Override
    public List<Person> getAllPerson() {
        PersonRowMapper personRowMapper = new PersonRowMapper ();
        List<Person> personList = getNamedParameterJdbcTemplate().query(SQL, personRowMapper);

        return personList ;
    }

这是我的junit

public class PersonDaoImplTest {

    @Mock
    protected NamedParameterJdbcTemplate namedParameterJdbcTemplate;

    @Mock
    protected PersonRowMapper personRowMapper;

    @InjectMocks
    private PersonDaoImpl personDaoImpl;

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

    @Test
    public void shouldReturnPerson() {
        when(namedParameterJdbcTemplate.query(anyString(), Matchers.<RowMapper<PersonRowMapper>> any())).thenReturn(anyList());

        List<Person> resultList = personDaoImpl.getAllPerson();
        assertTrue(!resultList.isEmpty());
    }

它会在List<Person> resultList = personDaoImpl.getAllPerson();

上抛出NPE

我错过了什么或没有正确嘲笑?任何帮助将不胜感激

2 个答案:

答案 0 :(得分:1)

不应该只是Matchers.<PersonRowMapper>吗?

when(namedParameterJdbcTemplate.query(anyString(), Matchers.<PersonRowMapper> any())).thenReturn(anyList());

答案 1 :(得分:0)

第一个解决方案(使用提供商).Recomended

    public class PersonDaoImpl extends AbstractDao implements PersonDao {

        private static final String SQL = "select * from personTable";

        com.google.inject.Provider<PersonRowMapper> provider;

        @Inject
        public PersonDaoImpl(Provider<PersonRowMapper> provider){
            this.provider = provider;
        }

        @Override
        public List<Person> getAllPerson() {
            PersonRowMapper personRowMapper = provider.get();
            List<Person> personList = getNamedParameterJdbcTemplate().query(SQL);

            return personList ;
        }

在测试中

 public class PersonDaoImplTest {

       @Mock
       com.google.inject.Provider<PersonRowMapper> provider;
       ......

       @Test
       public void shouldReturnPerson() {
           when(provider.get()).thenReturn(personRowMapper);
       }
}

第二种解决方案。

我很懒于再写一次如何模拟构造函数,只看我关于这个主题的答案PowerMockito.doReturn returns null(或在网上搜索),你很容易理解为什么很难嘲笑它并在单元测试下覆盖您的代码。单元测试的大师并不推荐使用模拟构造函数。