2016-06-11 8 views
0

Ich benutze Netbeans 8.1, Junit und Mockito, um Komponententest für mein Projekt zu schreiben. Hier einige Stücke von meinem CodeJUnit Mockito Mock eine Methode in einer anderen Klasse Fehler

Funktion getestet werden:

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; 
} 

My Test-Klasse:

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(); 

    } 
} 

Wie Sie sehen können, nenne ich session.checkACL2(), die definiert ist in einer anderen Klasse, verwende ich Using Mockito to mock a class method inside another class

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

aber es ca zu beheben lls NullPointerException bei Zeile.

+0

Welchen Junit-Läufer benutzen Sie? Haben Sie Ihre Klasse mit @RunWith (MockitoJUnitRunner.class) oder ähnlichem kommentiert? Können Sie Ihre komplette Klasse inklusive Importanweisungen posten? Sie können andere Funktionen entfernen, die nicht anwendbar sind. – TechCrunch

+0

Ich benutze Netbeans integrierte Junit 4.12. Ich habe vergessen, @RunWith (MockitoJUnitRunner.class) vorher hinzuzufügen, aber nachdem ich es hinzugefügt habe, zeigt es immer noch Fehler: verursacht einen Fehler: java.lang.NullPointerException. Und wenn ich zu Source gehe, bleibt es immer noch bei session.checkACL2() – Jane

+0

Sie brauchen thenReturn nicht zweimal. Können Sie den NullPointerException-Stack-Trace einfügen? – TechCrunch

Antwort

0

Gibst du eigentlich verspottet SessionController Instanz Ihre PersonalCenterController Instanz? Wenn Sie versuchen, SessionController Methoden direkt nach dem Mocking aufrufen, bringt es zurück, was Sie erwartet haben?

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

Wie ich NullPointerException hier sehen von session Beispiel könnte entweder sein null oder null Rückkehr wird, dass dann boolean umgewandelt wird. Mein erster Schritt wäre, herauszufinden, was es ist.

+0

Ich habe dieses Problem herausgefunden, aber wie Sie in der zu testenden Funktion sehen können, ist die Sitzung eine private Member-Variable. Wenn ich meine Pseudo-Session-Instanz auf die PersonalCenterController-Instanz setzen möchte, muss ich eine andere Methode in der Klasse setSession() aufrufen. Ist es richtig, eine andere Funktion aufzurufen, wenn ich eine Funktion teste? – Jane

+0

Wenn Sie einen einfachen Setter 'setSession()' ohne zusätzliches Verhalten haben, dann denke ich, dass es vollkommen in Ordnung ist. Wenn Sie eine komplexe Logik in 'setSession()' haben, aber Sie haben diese Logik mit anderen Tests abgedeckt, denke ich, dass es auch in Ordnung ist. –

0

Stellen Sie sicher, dass Sie Ihre JUnit mit 'MockitoJUnitRunner.class' ausführen.

@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

Ich @RunWith hinzufügen (MockitoJUnitRunner.class) vor meinem Test, aber es zeigt immer noch Fehler: einen Fehler verursacht: java.lang.NullPointerException. Und wenn ich zu Source gehe, bleibt es immer noch bei session.checkACL2() – Jane