2016-09-20 7 views
1

私はこのDAOを模倣しようとしており、NPEを手に入れています。私は何かを正しく嘲笑していないか、私は何かを不適切に使用しているかどうか分からない。私は、以下のこのDAOあります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 ; 
    } 

をそして、これはそれは私が何をしないか、正しくからかっていないですList<Person> resultList = personDaoImpl.getAllPerson();

にNPEをスロー

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()); 
    } 

私のJUnitのでしょうか?どんな助けもありがたいです

+0

メソッドにコンストラクタがある場合、テストでコードをカバーするのは非常に難しいでしょう。 PersonRowMapperまたはモックコンストラクタ(PowerMock)用のプロバイダでコードを書き直すか、argThat –

+0

@EvgeniyKでmatcherを書き込むという選択肢がいくつかあります。これらの3つのオプションの例を挙げることができますか?なぜメソッドのコンストラクタでテストするのが難しいのですか? – zachandcode

答えて

1

ちょうどMatchers.<PersonRowMapper>でなければなりませんか?

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

まだNPE – zachandcode

+1

(PersonRowMapper.class)はありません。 – blue

+0

はありません。それでもNPEを与えて、私はそれを試してみました。 – zachandcode

0

(プロバイダで)第1の解決策は

public class PersonDaoImplTest { 

     @Mock 
     com.google.inject.Provider<PersonRowMapper> provider; 
     ...... 

     @Test 
     public void shouldReturnPerson() { 
      when(provider.get()).thenReturn(personRowMapper); 
     } 
} 

を試験で第二の溶液を

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 ; 
     } 

を.Recomended。

私はコンストラクタを模擬する方法をもう一度書くだけで、このトピックに関する私の答えを見てください。PowerMockito.doReturn returns null(またはWeb上で検索してください)、あなたはそれを模擬して単体テスト。単体テストの教祖はモックコンストラクタを推奨しません。

関連する問題