2016-08-30 4 views
0

Получение исключения нулевого указателя на mockito.when для строки ниже кода.Junit test case для диспетчера объектов

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

Edit: Ах, говорил в ближайшее время. Ошибка здесь ...

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

entityManager является насмешка. По умолчанию макет возвращает null. Итак, entityManager.createQuery(...) вернет значение null. Вызов setParameter на null - это 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 { ... 

или ...

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

Оба способа приведут к Mockito создания всех объектов, где переменные аннотированные с @Mock (он также обрабатывает @ InjectMocks и т. Д.).

Если это не поможет, вам придется опубликовать больше вашего тестового класса, иначе, возможно, никто не сможет помочь.

+0

добавлен полный тест класс.Issue все еще существует. – Jill

+0

Ах, мой плохой, исправил ответ. –