2016-06-11 5 views
0

Я использую Netbeans 8.1, Junit и Mockito для написания модульного теста для моего проекта. Вот некоторые части моего кодаJUnit Mockito mock one method in another class Ошибка

Для обследованы функции:

public Map<String, String> getAllUsers() { 

    if (allUsers == null) { 
     if (session.checkACL2("DonateBookPrivilegeLevel") || session.checkACL2("ManageUserPrivilegeLevel")) { 
      Iterator<User> it = userFc.findAll().iterator(); 
      System.out.println("PC::enum()"); 
      allUsers = new HashMap<String, String>(); 
      while (it.hasNext()) { 
       User item = it.next(); 
       allUsers.put(item.getName(), item.getUserId().toString()); 
      } 
     } 
    } 
    return allUsers; 
} 

Мой класс Тест:

package com.controller; 

import com.entities.User; 
import com.jsfc.util.JsfUtil; 
import java.util.ArrayList; 
import java.util.List; 
import java.util.Map; 
import javax.faces.event.ActionEvent; 
import org.junit.After; 
import org.junit.AfterClass; 
import org.junit.Before; 
import org.junit.BeforeClass; 
import org.junit.Test; 
import static org.junit.Assert.*; 
import org.junit.runner.RunWith; 
import static org.mockito.Matchers.any; 
import static org.mockito.Matchers.anyInt; 
import static org.mockito.Matchers.anyObject; 
import static org.mockito.Matchers.anyString; 
import org.mockito.Mock; 
import org.mockito.Mockito; 
import static org.mockito.Mockito.doReturn; 
import static org.mockito.Mockito.mock; 
import static org.mockito.Mockito.spy; 
import static org.mockito.Mockito.when; 
import org.mockito.MockitoAnnotations; 
import org.mockito.runners.MockitoJUnitRunner; 


@RunWith(MockitoJUnitRunner.class) 
public class PersonalCenterControllerTest { 

    public PersonalCenterControllerTest() { 
    } 

    @BeforeClass 
    public static void setUpClass() { 

    } 

    @AfterClass 
    public static void tearDownClass() { 
    } 

    @Before 
    public void setUp() { 
     MockitoAnnotations.initMocks(this); 
    } 

    @After 
    public void tearDown() { 
    } 

    /** 
    * Test of getAllUsers method, of class PersonalCenterController. 
    */ 
    @Test 
    public void testGetAllUsers() { 
     System.out.println("getAllUsers"); 

     PersonalCenterController pcController = new PersonalCenterController(); 

     SessionController session = Mockito.mock(SessionController.class); 

     when(session.checkACL2(anyString())).thenReturn(true).thenReturn(true); 

     Map<String,String> userMap = null; 
     userMap = pcController.getAllUsers(); 

    } 
} 

Как вы можете видеть, я называю session.checkACL2(), который определяется в другом классе, я использую Using Mockito to mock a class method inside another class исправить

SessionController session = Mockito.mock(SessionController.class); 
doReturn(true).when(session).checkACL2((String) anyObject()); 

но ча lls NullPointerException на линии if.

+0

Какой ты хочешь работать? Вы аннотировали свой класс, используя @RunWith (MockitoJUnitRunner.class) или что-то подобное? Можете ли вы опубликовать свой полный класс, включая импортные заявления? Вы можете удалить другие функции, которые не применимы. – TechCrunch

+0

Я использую Netbeans интегрированный junit 4.12. Я забыл добавить @RunWith (MockitoJUnitRunner.class) раньше, но после того, как я его добавлю, он все еще показывает ошибку: вызвала ошибку: java.lang.NullPointerException. И когда я перехожу к Источнику, он все еще застрял в session.checkACL2() – Jane

+0

Вам не нужно, а затем повторить дважды. Можете ли вы вставить трассировку стека NullPointerException? – TechCrunch

ответ

0

ли вы на самом деле проходит высмеивал SessionController экземпляр к вашему PersonalCenterController например? Если вы попробуете называть методы SessionController сразу после издевательств, он возвращает то, что вы ожидали?

SessionController session = Mockito.mock(SessionController.class); 
when(session.checkACL2(anyString())).thenReturn(true).thenReturn(true); 
assertTrue(session.checkACL2("DonateBookPrivilegeLevel")); 
assertTrue(session.checkACL2("ManageUserPrivilegeLevel"); 

Как я вижу NullPointerException здесь может быть от session например, либо быть null или возвращение null, который затем преобразуется в boolean. Моим первым шагом было бы выяснить, что это такое.

+0

Я узнал об этой проблеме, но, как вы можете видеть в проверенной функции, сессия является частной переменной-членом. Если я хочу установить свой экземпляр mock session в экземпляр PersonalCenterController, я должен вызвать другой метод в классе setSession(), правильно ли вызывать другую функцию при проверке одной функции? – Jane

+0

Если у вас есть простой setter 'setSession()' без дополнительного поведения, то я думаю, что все в порядке. Если у вас есть сложная логика внутри 'setSession()', но вы рассмотрели эту логику с помощью других тестов, я думаю, что это тоже нормально. –

0

Убедитесь, что вы используете JUnit с помощью «MockitoJUnitRunner.class».

@RunWith(MockitoJUnitRunner.class) 
public class MyClassTest{ 

public void myMethodTest(){ 
    SessionController session = Mockito.mock(SessionController.class); 
Mockito.when(session).checkACL2(Mockito.anyString()).thenReturn(true).thenReturn(true); 
    //Write logic to test your businesss logic inside class and assert the result. 
} 

} 
+0

Я добавляю @RunWith (MockitoJUnitRunner.class) перед моим тестом, но он все еще показывает ошибку: вызвала ошибку: java.lang.NullPointerException. И когда я перехожу к Source, он все еще застрял в session.checkACL2() – Jane