2016-09-20 3 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 ; 
    } 

을 그리고 이것은 내 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) 용 Provider로 코드를 다시 작성하거나 argThat –

+0

@EvgeniyK로 matcher를 작성하십시오. 이 세 가지 옵션 중 하나의 예제를 제공 할 수 있습니까? 왜 메소드의 생성자로 테스트하기가 어렵습니까? – zachandcode

답변

1

그냥 Matchers.<PersonRowMapper>일까요? (제공자)와

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

여전히 NPE를 제공합니다 – zachandcode

+1

어쨌든 (PersonRowMapper.class) – blue

+0

은 어떨까요? 아직도 NPE를 제공합니다. 나는 그것을 시도했습니다. – zachandcode

0

먼저 용액

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 (또는 웹에서 검색)을 사용하면 모의하기 어렵고 단위 테스트에서 코드를 커버하는 이유를 쉽게 이해할 수 있습니다 . 유닛 테스트의 전문가는 모의 생성자를 권장하지 않습니다.

관련 문제