无法将模拟传递给注入模拟服务
Can't pass mock to the inject mock service
我有服务:
@Service
class UserService {
private final Map<AbstractSomeService, CustomEnum> someMap;
public UserService(List<AbstractSomeService> someService) {
someService.forEach(service -> someMap.put(service.getCustomEnum(), service));
}
public void logicExecution() {
//code
}
}
当我如下模拟时:我得到 NullPointer:
@Mock
private SomeService someService; // Service which is extended of AbstractSomeService
@InjectMocks
private UserService userService = new UserService(Collection.singletonList(someService))
@BeforeEach
void setUp() {
MockitoAnnotations.openMocks(this);
}
@Test
public void testBrokenJunit() {
userService.logicExecution(); // NULL POINTER HERE (
}
一些服务:
@Service
public class SomeService extends AbstactSomeService() {
public CustomEnum getCustomEnum() {
return CustomEnum.BROKEN_JUNIT_TEST;
}
//logic here
}
堆栈跟踪非常简单:
java.lang.NullPointerException: Cannot invoke "getCustomEnum()" because "service" is null
没有构造函数初始化的 StackTrace:
org.mockito.exceptions.misusing.InjectMocksException:
Cannot instantiate @InjectMocks field named 'UserService' of type '...'.
You haven't provided the instance at field declaration so I tried to construct the instance.
However the constructor or the initialization block threw an exception : Cannot invoke "java.util.List.forEach(java.util.function.Consumer)" because "someService" is null
at
Caused by: java.lang.NullPointerException: Cannot invoke "java.util.List.forEach(java.util.function.Consumer)" because "someService" is null
at UserService.<init>
P.S.
当我使用 UserService 的真实对象时,不是模拟,一切正常。
但它不适用于@InjectMocks
使用@MockBean
创建模拟对象
import org.springframework.boot.test.mock.mockito.MockBean;
@MockBean
private User user;
在测试中尝试以下操作 class(您不需要通过构造函数使用新实例初始化 UserService
,@InjectMocks
会为您完成):
@Mock
private SomeService someService;
@InjectMocks
private UserService userService;
@BeforeEach
void setUp() {
MockitoAnnotations.openMocks(this);
}
@Test
public void testBrokenJunit() {
userService.logicExecution();
}
如果这不起作用,因为您有 List
而不是简单的 SomeService
,您可以执行以下操作:
@Mock
private SomeService someService;
private UserService userService;
@BeforeEach
void setUp() {
MockitoAnnotations.openMocks(this);
userService = new UserService(Collection.singletonList(someService));
}
@Test
public void testBrokenJunit() {
userService.logicExecution();
}
我有服务:
@Service
class UserService {
private final Map<AbstractSomeService, CustomEnum> someMap;
public UserService(List<AbstractSomeService> someService) {
someService.forEach(service -> someMap.put(service.getCustomEnum(), service));
}
public void logicExecution() {
//code
}
}
当我如下模拟时:我得到 NullPointer:
@Mock
private SomeService someService; // Service which is extended of AbstractSomeService
@InjectMocks
private UserService userService = new UserService(Collection.singletonList(someService))
@BeforeEach
void setUp() {
MockitoAnnotations.openMocks(this);
}
@Test
public void testBrokenJunit() {
userService.logicExecution(); // NULL POINTER HERE (
}
一些服务:
@Service
public class SomeService extends AbstactSomeService() {
public CustomEnum getCustomEnum() {
return CustomEnum.BROKEN_JUNIT_TEST;
}
//logic here
}
堆栈跟踪非常简单:
java.lang.NullPointerException: Cannot invoke "getCustomEnum()" because "service" is null
没有构造函数初始化的 StackTrace:
org.mockito.exceptions.misusing.InjectMocksException:
Cannot instantiate @InjectMocks field named 'UserService' of type '...'.
You haven't provided the instance at field declaration so I tried to construct the instance.
However the constructor or the initialization block threw an exception : Cannot invoke "java.util.List.forEach(java.util.function.Consumer)" because "someService" is null
at
Caused by: java.lang.NullPointerException: Cannot invoke "java.util.List.forEach(java.util.function.Consumer)" because "someService" is null
at UserService.<init>
P.S.
当我使用 UserService 的真实对象时,不是模拟,一切正常。
但它不适用于@InjectMocks
使用@MockBean
创建模拟对象
import org.springframework.boot.test.mock.mockito.MockBean;
@MockBean
private User user;
在测试中尝试以下操作 class(您不需要通过构造函数使用新实例初始化 UserService
,@InjectMocks
会为您完成):
@Mock
private SomeService someService;
@InjectMocks
private UserService userService;
@BeforeEach
void setUp() {
MockitoAnnotations.openMocks(this);
}
@Test
public void testBrokenJunit() {
userService.logicExecution();
}
如果这不起作用,因为您有 List
而不是简单的 SomeService
,您可以执行以下操作:
@Mock
private SomeService someService;
private UserService userService;
@BeforeEach
void setUp() {
MockitoAnnotations.openMocks(this);
userService = new UserService(Collection.singletonList(someService));
}
@Test
public void testBrokenJunit() {
userService.logicExecution();
}