Junit Mockito单元测试用例给出了空指针异常

时间:2020-04-21 04:07:38

标签: mockito junit5

你好,我是Junit Mockito的新手,我正在尝试编写单元测试 情况,但是当我运行测试用例时,我得到的是空指针

代码段:

package com.dataguise.webservices;

import static org.junit.jupiter.api.Assertions.*;

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;


import static org.mockito.Mockito.*;

import com.dataguise.cache.CacheManager;
import com.dataguise.controller.CentralController;

import com.dataguise.webservices.beans.DgUserAuthorities;

class RestAPIsTest {


    @InjectMocks
    private CentralController controller;

    @Mock
    DgUserAuthorities dgUserAuthorities;

    @Mock
    private CacheManager cacheManager;


    @BeforeEach
    public void setup() {
        when(this.cacheManager.getCache(anyString())).thenReturn(true);
        MockitoAnnotations.initMocks(this);

    }

    @Test
    void testSession() {
        try {

            dgUserAuthorities = controller.login("d", "d", "", false);
            when(controller.login("d", "d", "", false)).thenReturn(dgUserAuthorities);
            assertEquals(dgUserAuthorities, dgUserAuthorities);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

在rest api中相同的方法调用会给出适当的结果。

1 个答案:

答案 0 :(得分:1)

测试中有2个错误

错误1:混合JUnit4和JUnit5批注

  • org.junit.jupiter.api.Test来自JUnit 5
  • org.junit.Before来自JUnit 4

因此,您的@Before方法永远不会执行。请改用org.junit.jupiter.api.BeforeEach

错误2:使用不带Spring Extension的Spring注释

@Autowired来自Spring的DI框架。仅当您使用Spring Injection /流道时才会注入

如果您想MockitoAnnotations.initMocks(this);构建被测对象并注入所有模拟,请使用@InjectMocks

错误3:初始化模拟的混乱方式

有两种初始化模拟的方法:

手动:

this.dgUserAuthorities = mock(DgUserAuthorities.class);
this.controller = new CentralController(this.dgUserAuthorities);

使用注释

@InjectMocks
private CentralController controller;

@Mock
DgUserAuthorities dgUserAuthorities;

注释需要调用MockitoAnnotations.initMocks(this)或使用Mockito扩展名:@ExtendWith(MockitoExtension.class)

我强烈建议您不要混合使用两种方法。 另外,如果您使用注释,请不要自己初始化字段。