2016-09-20 131 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(或在網上搜索),你很容易理解爲什麼很難嘲笑它,並在單元測試下覆蓋你的代碼。單元測試的大師不推薦模擬構造函數。