首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何模拟RowMapper?

如何模拟RowMapper?
EN

Stack Overflow用户
提问于 2016-09-20 08:17:38
回答 2查看 7K关注 0票数 2

我试着嘲笑这个道然后我得到了一个NPE。我不确定我是不是没有正确地模仿一些东西,或者我使用了一些不恰当的东西。我有下面这条道:

代码语言:javascript
复制
@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

代码语言:javascript
复制
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

我遗漏了什么或者没有正确地模仿?任何帮助都将不胜感激

EN

回答 2

Stack Overflow用户

发布于 2016-09-20 08:29:36

难道不应该是Matchers.<PersonRowMapper>吗?

代码语言:javascript
复制
when(namedParameterJdbcTemplate.query(anyString(), Matchers.<PersonRowMapper> any())).thenReturn(anyList());
票数 2
EN

Stack Overflow用户

发布于 2016-09-20 11:31:12

第一个解决方案(包含提供商).Recomended

代码语言:javascript
复制
    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 ;
        }

在测试中

代码语言:javascript
复制
 public class PersonDaoImplTest {

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

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

第二种解决方案。

我很懒得再写一遍如何模拟构造函数,看看我在这个主题PowerMockito.doReturn returns null (或者在web上搜索)上的答案,你就会很容易理解为什么很难模拟它并在单元测试下覆盖你的代码。单元测试专家不推荐使用模拟构造函数。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39583893

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档