JUnit Mockito在另一个类中模拟一个方法错误 [英] JUnit Mockito mock one method in another class Error

查看:107
本文介绍了JUnit Mockito在另一个类中模拟一个方法错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用Netbeans 8.1,Junit和Mockito来为我的项目编写单元测试. 这是我的一些代码

I use Netbeans 8.1 , Junit and Mockito to write unit test for my project. Here is some pieces of my code

要测试的功能:

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(),我使用

As you can see, I call session.checkACL2() which is defined in another class, I use Using Mockito to mock a class method inside another class to fix

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

,但在if行调用NullPointerException.

推荐答案

您是否真的将模拟的SessionController实例传递给了PersonalCenterController实例? 如果您尝试在模拟后立即调用SessionController方法,它会返回您期望的结果吗?

Are you actually passing mocked SessionController instance to your PersonalCenterController instance? If you try calling SessionController methods right after mocking does it return what you expected?

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.我的第一步是弄清楚是哪个.

As I see NullPointerException here could be from session instance either being null or returning null, that is then being converted to boolean. My first step would be to figure out which is it.

这篇关于JUnit Mockito在另一个类中模拟一个方法错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆