2016-06-11 57 views
0

我使用Netbeans 8.1,Junit和Mockito爲我的項目編寫單元測試。 下面是我的一些代碼片段JUnit Mockito在另一個類中模擬一種方法錯誤

要測試功能:

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

但是它ca如果在線,則爲。

+0

您使用的是Junit亞軍?你有沒有使用@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

我發現了這個問題,但正如您在待測功能中所看到的,session是一個私有成員變量。如果我想將我的模擬會話實例設置爲PersonalCenterController實例,則必須在類setSession()中調用另一個方法,在測試一個函數時調用另一個函數是否正確? – Jane

+0

如果你有一個簡單的setter()setSession()'沒有額外的行爲,那麼我認爲它是完全正確的。如果你在'setSession()'裏面有一些複雜的邏輯,但你已經用其他測試覆蓋了這個邏輯,我認爲它也很好。 –

0

確保您使用'MockitoJUnitRunner.class'運行您的JUnit。

@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

相關問題