【问题标题】:How to Mock RowMapper?如何模拟 RowMapper?
【发布时间】:2016-09-20 00:17:38
【问题描述】:

我试图模拟这个 dao,我得到了一个 NPE。我不确定我是不是在正确地嘲笑某些东西,或者我在不恰当地使用某些东西。我在下面有这个 dao:

@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&lt;Person&gt; resultList = personDaoImpl.getAllPerson(); 上抛出 NPE

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

【问题讨论】:

  • 如果你的方法中有构造函数,你的代码很难被测试覆盖。您有多种选择:使用 PersonRowMapper 的 Provider 或模拟构造函数 (PowerMock) 重写代码或使用 argThat 编写匹配器
  • @EvgeniyK。你能提供这三个选项中的任何一个的例子吗?为什么很难在方法中使用构造函数进行测试?

标签: java unit-testing junit


【解决方案1】:

不应该只是Matchers.&lt;PersonRowMapper&gt;吗?

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

【讨论】:

  • 仍然给NPE
  • 怎么样(PersonRowMapper.class)
【解决方案2】:

第一个解决方案(有提供者)。推荐

    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(或在网上搜索),你很容易理解为什么很难模拟它并在单元下覆盖你的代码测试。单元测试大师不推荐模拟构造函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-13
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 2015-02-19
    相关资源
    最近更新 更多