繁体   English   中英

无法将模拟传递给注入模拟服务

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM