Java 如何模拟RowMapper?
我试图模仿这把刀,我得到了一个NPE。我不确定我是不是在正确地嘲笑某些东西,还是在不恰当地使用某些东西。我有一把刀在下面:Java 如何模拟RowMapper?,java,unit-testing,junit,Java,Unit Testing,Junit,我试图模仿这把刀,我得到了一个NPE。我不确定我是不是在正确地嘲笑某些东西,还是在不恰当地使用某些东西。我有一把刀在下面: @Repository public class PersonDaoImpl extends AbstractDao implements PersonDao { private static final String SQL = "select * from personTable"; @Override public List<Perso
@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 ;
}
@存储库
公共类PersondaImpl扩展了AbstractDao实现PersonDao{
私有静态最终字符串SQL=“select*fromPersontable”;
@凌驾
公共列表getAllPerson(){
PersonRowMapper PersonRowMapper=新的PersonRowMapper();
List personList=getNamedParameterJdbcTemplate().query(SQL,personRowMapper);
回归人格;
}
这是我的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());
}
public类persondaomplatest{
@嘲弄
受保护的NamedParameterJdbcTemplate NamedParameterJdbcTemplate;
@嘲弄
受保护的个人地图绘制者;
@注射模拟
私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人;
@以前
公共作废设置(){
initMocks(this);
}
@试验
public void shouldReturnPerson(){
当(namedParameterJdbcTemplate.query(anyString(),Matchers.any())。然后返回(anyList());
List resultList=persondaimpl.getAllPerson();
assertTrue(!resultList.isEmpty());
}
它在List resultList=personDaoImpl.getAllPerson();
我遗漏了什么或没有正确地模仿什么?任何帮助都将不胜感激。不应该只是
匹配者。
when(namedParameterJdbcTemplate.query(anyString(),Matchers.any())。然后返回(anyList());
第一个解决方案(带提供商)。推荐
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类PersonDaoImpl扩展了抽象dao实现PersonDao{
私有静态最终字符串SQL=“select*fromPersontable”;
com.google.inject.Provider提供商;
@注入
公共人员导入(提供者){
this.provider=提供者;
}
@凌驾
公共列表getAllPerson(){
PersonRowMapper PersonRowMapper=provider.get();
List personList=getNamedParameterJdbcTemplate().query(SQL);
回归人格;
}
试验中
public class PersonDaoImplTest {
@Mock
com.google.inject.Provider<PersonRowMapper> provider;
......
@Test
public void shouldReturnPerson() {
when(provider.get()).thenReturn(personRowMapper);
}
}
public类persondaomplatest{
@嘲弄
com.google.inject.Provider提供商;
......
@试验
public void shouldReturnPerson(){
when(provider.get()).thenReturn(personRowMapper);
}
}
第二个解决方案
我很懒得再写一次如何模拟构造函数,只要看看我关于这个主题的答案(或在网上搜索),你就很容易理解为什么很难模拟它并在单元测试中覆盖你的代码。单元测试专家不推荐模拟构造函数。仍然给出了NPEHow关于任何(PersonRowMapper.class)的信息如果在方法中有构造函数,则很难用测试覆盖代码。您有几种选择:使用PersonRowMapper的提供程序或模拟构造函数(PowerMock)重写代码,或使用argThat@EvgeniyK.你能提供这三个选项中任何一个的例子吗?为什么在方法中很难用构造函数进行测试?
public class PersonDaoImplTest {
@Mock
com.google.inject.Provider<PersonRowMapper> provider;
......
@Test
public void shouldReturnPerson() {
when(provider.get()).thenReturn(personRowMapper);
}
}