我试图嘲笑这个dao并且我得到了一个NPE。我不确定我是不是在嘲笑某些东西,或者我是否使用了不恰当的东西。我在下面有这个道具:
@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();
我错过了什么或没有正确嘲笑?任何帮助将不胜感激
答案 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(或在网上搜索),你很容易理解为什么很难嘲笑它并在单元测试下覆盖您的代码。单元测试的大师并不推荐使用模拟构造函数。