你好,我是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中相同的方法调用会给出适当的结果。
答案 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)
我强烈建议您不要混合使用两种方法。 另外,如果您使用注释,请不要自己初始化字段。