2016-09-20 128 views
1

我试图嘲笑这个道,我得到一个NPE。我不确定我是不是正确地嘲笑某些东西,或者我正在使用不适当的东西。我有低于此道:如何模拟RowMapper?

@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我缺少或没有正确嘲讽?任何帮助,将不胜感激

+0

如果您在方法中使用构造函数,那么使用测试覆盖代码将非常困难。 你有几种选择:用PersonRowMapper提供者或者模拟构造函数(PowerMock)重写代码,或者用argThat –

+0

@EvgeniyK编写匹配器。你能举出这三个选项中的任何一个吗?为什么很难用方法中的构造函数进行测试? – zachandcode

回答

1

它不应该只是Matchers.<PersonRowMapper>

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

还给NPE – zachandcode

+1

如何处理任何(PersonRowMapper.class) – blue

+0

nope。仍然给NPE,我已经尝试过了。 – zachandcode

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