2016-08-30 4 views
0

아래 코드 줄에 대한 mockito.when에 널 포인터 예외가 발생합니다.엔티티 관리자 용 Junit 테스트 케이스

when(entityManager.createQuery(any(String.class)).setParameter(any(String.class), any(String.class)).getSingleResult()).thenReturn("2"); 

모의 엔티티 관리자에 노력이 문제를 해결하기 위해 어떤 도움

@Mock private EntityManager entityManager;

로 선언 된?

전체 테스트 클래스는

import main.java.com.as.dao.ASDAOImpl; 
 

 
import org.junit.runner.RunWith; 
 
import org.mockito.InjectMocks; 
 
import org.mockito.Mock; 
 
import org.mockito.runners.MockitoJUnitRunner; 
 
import org.springframework.test.util.ReflectionTestUtils; 
 

 
import static org.mockito.Matchers.any; 
 
import static org.mockito.Mockito.*; 
 

 
import org.junit.Before; 
 
import org.junit.Ignore; 
 
import org.junit.Test; 
 
@RunWith(MockitoJUnitRunner.class) 
 
public class ASDAOImplTest 
 
{ 
 
    @InjectMocks 
 
    ASDAOImpl asdaoImpl=new ASDAOImpl(); 
 
    @Mock 
 
    private EntityManager entityManager; 
 
    
 
    @Before 
 
    public void setUp() 
 
    { 
 
     ReflectionTestUtils.setField(asdaoImpl,"capLimit", 1); 
 
    } 
 
    
 
    @Test 
 
    @Ignore 
 
    public void validateCappingTest() 
 
    { 
 
     when(entityManager.createQuery(any(String.class)).setParameter(any(String.class), any(String.class)).getSingleResult()).thenReturn("2"); 
 
     asdaoImpl.validateCapping("2"); 
 
    } 
 
    
 

 
}

답변

1

편집 : 아, 곧에 말했다. 오류는 여기에 있습니다 ...

when(entityManager.createQuery(any(String.class)).setParameter(...) 

entityManager은 모의 모형입니다. 기본적으로 모의는 null을 반환합니다. 따라서 entityManager.createQuery(...)은 null을 반환합니다. null에 setParameter을 호출하면 NPE입니다.

무엇을 삽입해야하는 쿼리 모의은 ...

@Mock 
private Query query; 

... 

// when createQuery is called, return the mocked query object (instead of null) 
when(entityManager.createQuery(any(String.class)).thenReturn(query); 

// make sure that setParameter returns this query object back (would otherwise also be NPE) 
when(query.setParameter(any(String.class), any(String.class)).thenReturn(query); 

// And return the desired result from getSingleResult 
when(query.getSingleResult()).thenReturn("2"); 

올드 답 : 전체 코드없이 말할 하드

하지만 추측은 당신이를 misssing되는 것 Mockito 초기화 (@Mock 주석이 달린 변수에 대한 객체를 실제로 생성하는 부분). 이것은 적어도 두 가지 방법으로 수행 할 수 있습니다

// Run the whole test with the Mockito runner... 
@RunWith(MockitoJUnitRunner.class) 
public class MyTestClass { ... 

또는 ... Mockito는 변수 (그것은 또한 처리 @Mock 주석 모든 객체를 생성으로 이어질 것입니다

// Do the Mockito initialization "manually" 
@Before 
public void init() { 
    MockitoAnnotations.initMocks(this); 
} 

두 가지 방법 @ InjectMocks 등).

도움이되지 않으면 테스트 클래스를 더 게시해야합니다. 그렇지 않으면 아무도 도움을받을 수 없을 것입니다.

+0

전체 테스트 클래스가 추가되었습니다. 여전히 문제가 있습니다. – Jill

+0

아, 내 잘못, 해답을 고쳤다. –

관련 문제