[英]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>
聚苯乙烯
当我使用 UserService 的真实对象时,不是模拟一切都可以。
但它不适用于@InjectMocks
使用@MockBean
创建模拟对象
import org.springframework.boot.test.mock.mockito.MockBean;
@MockBean
private User user;
在您的测试类中尝试以下操作(您不需要通过构造函数使用新实例初始化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();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.