【发布时间】: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<Person> resultList = personDaoImpl.getAllPerson(); 上抛出 NPE
我错过了什么或没有正确模拟?任何帮助将不胜感激
【问题讨论】:
-
如果你的方法中有构造函数,你的代码很难被测试覆盖。您有多种选择:使用 PersonRowMapper 的 Provider 或模拟构造函数 (PowerMock) 重写代码或使用 argThat 编写匹配器
-
@EvgeniyK。你能提供这三个选项中的任何一个的例子吗?为什么很难在方法中使用构造函数进行测试?
标签: java unit-testing junit