2015-03-17 2 views
0

Это мой тестовый классПередразнивало Метод бросает NullPointerException в Mockito

 @RunWith(MockitoJUnitRunner.class) 
    public class ServiceTest extends Service{ 


    @Mock 
    EntityManager eman = Mockito.mock(EntityManager.class); 
    @Mock 
    Query query; 

    @InjectMocks 
    private Service service; 


    private static final String NAME = "name"; 


    @Before 
    public void setUp() { 

    this.service=new Service(); 

     } 


    @Test 
    public void firstMethodTest() { 


    Query query = mock(Query.class); 
    when(
      eman.createNamedQuery(NAME)).thenReturn(query); 

    when 
     ( query.setParameter("name", Type)).thenReturn(query); 

    when (query.getSingleResult()).thenReturn(type); 

    **service.getAllMethod(1, "string");** 


     assertSame(/*Something to compare */); 

    } 
} 

Это мой метод класса Service

public getAllMethod(int ID, String string) 
     { 


     Query query=em 
       .createNamedQuery("name"); 

     **query.setParameter("string", Type);** 
     type= query.getSingleResult(); 


} 

Когда service.getAllMethod (1, "String") вызывается из Mocked Object, я получаю NPE в query.setParameter («name», Type), потому что я думаю, что запрос по-прежнему NULL. Пожалуйста, предположите, что My Service работает нормально. Спасибо заранее

При отладке я проверить значение запроса запросов в сервис class.Its значение null.Cant выяснить, как решить эту проблему.

ответ

1

Вы воссоздаете свое обслуживание перед каждым тестом. Таким образом, Service, что Mockito впрыскивает насмешки, потерян.

Избавиться от метода setUp и, вместо того, чтобы объявить службы, как это:

@InjectMocks 
private Service service = new Service(); 

Есть некоторые другие вещи тоже неправильно. например EntityManagerMockito.mock не требуется, класс испытания не должен распространяться Service, @Mock Query не используется.


Вот грубый шаблон, чтобы начать с:

@RunWith(MockitoJUnitRunner.class) 
public class TestA { 

    @Mock 
    EntityManager eman; 

    @InjectMocks 
    private Service service = new Service(); 

    @Test 
    public void firstMethodTest() { 
     Query query = Mockito.mock(Query.class); 
     Mockito.when(eman.createNamedQuery(NAME)).thenReturn(query); 

     service.getAllMethod(1, "string"); 
    } 
} 

Предполагая, что служба что-то вроде:

public class Service { 
    @Autowired 
    EntityManager entityManager; 

    public void getAllMethod(int i, String s) { 
     Query q = entityManager.createNamedQuery("name"); 
     ... q isn't null here for me 
    } 
} 
+0

Я сделал изменения, как это было предложено @Mr ложке. И тот же результат. –

+0

Я отредактировал ответ: попробуйте это как отправную точку для вашего теста. –

+0

Btw, @Mr Spoon, с '@ InjectMocks', Mockito автоматически инициализирует эти переменные с помощью аннотации' @ RunWith' или 'MockitoAnnotations # initMocks()' –

Смежные вопросы