Mockito - 没有为其中一个测试用例注入模拟

Mockito - Mock not being injected for one of the testcases

我有一个 jsf spring 应用程序并使用 mockito 进行单元测试。当我在 iEmployeeService 模拟中 运行 我的 junit 测试时,我一直得到 NullPointerExceptioniSecurityLoginService 没有 Exception

要模拟的方法

@Autowired
IEmployeeService iEmployeeService;
@Autowired
ISecurityLoginService iSecurityLoginService;
public void addEvent() {

    entityEventsCreate.setTitle(entityEventsCreate.getTitle());
    entityEventsCreate.setModifiedBy(iSecurityLoginService
                .findLoggedInUserId());

    int eventId = iEmployeeService.addEmployeeTimeOff(entityEventsCreate);
}

我的 JUnit 测试用 @RunWith(MockitoJUnitRunner.class)

注释
@Mock
ISecurityLoginService iSecurityLoginService;

@Mock
IEmployeeService iEmployeeService;

@InjectMocks
ServiceCalendarViewBean serviceCalendarViewBean  = new ServiceCalendarViewBean();

@Before public void initMocks() {
           MockitoAnnotations.initMocks(this);
}

@Test
public void testSaveEvent() {
    Mockito.when(iSecurityLoginService.findLoggedInUserId()).thenReturn(1);
    serviceCalendarViewBean.getEntityEventsCreate().setTitle("Junit Event Testing");

    Mockito.when(iSecurityLoginService.findLoggedInUserId()).thenReturn(1);
    Mockito.when(iEmployeeService.addEmployeeTimeOff(Mockito.any(Events.class))).thenReturn(2);

    serviceCalendarViewBean.addEvent();
}

尝试添加这个

@Before
public void initMocks() {
    MockitoAnnotations.initMocks(this);
}

与问题无关,但很有用!

如果测试用 @RunWith(MockitoJUnitRunner.class) 注释,则 MockitoAnnotations.initMocks(this); 不是必需的(它甚至可能在注入时导致问题),mockito runner 执行注入和其他内容来验证模拟。

同时拥有两种 mock init 机制可能会导致注入和存根问题,这是由于 JUnit 测试的生命周期方式以及 mockito 单元集成代码的使用方式所致:

  1. 运行器将创建模拟并将这些模拟注入测试对象。
  2. 然后 @Before 方法启动并重新创建新的模拟,并且可能不会执行注入,因为对象已经初始化。

我解决了问题..在我的 spring bean 中,我有 2 个对象用于相同的服务接口。所以模拟是为第一个接口对象设置的。

例如:在我的豆子里,

@Autowired
IEmployeeService employeeService;
@Autowired
IEmployeeService iEmployeeService;

因此,为 IEmployeeservice 接口创建的模拟是为与其名称无关的第一个服务对象注入的。

@Mock
IEmployeeService iEmployeeService;

即,模拟对象 'iEmployeeService' 被注入到 bean 'employeeService' 中。

感谢所有帮助过的人..:)

我有一个类似的问题,经过几次研究,我发现 @InjectMocks 似乎没有工作,并且在没有注入 @AutoWired 私有对象的情况下默默地失败了 ,

解决方案:更改设计,通过构造函数使依赖关系可见,

IEmployeeService iEmployeeService;
ISecurityLoginService iSecurityLoginService;

@Autowired
public ServiceCalendarViewBean(final IEmployeeService iEmployeeService,
                final ISecurityLoginService iSecurityLoginService){
    this.iEmployeeService=iEmployeeService;
    this.iSecurityLoginService=iSecurityLoginService;
}

这个 link 帮助我确定了如何处理 @Autowired 不可见的对象

需要考虑的一件事是,如果您的 class 中有一个 non-empty 构造函数,您必须在测试中调用 MockitoAnnotations.initMocks class 因为 InjectMocks 注释不会工作,例如:

public class classA {

  @Autowired
  private ClassB classB;

  private Integer i;

  public ClassA(Integer i) {
    this.i = i;
  }

} 

Mockito 将尝试使用该构造函数,使用 InjectMocks 注释注入模拟将失败,因此您将需要调用 initMocks 方法,不确定是否是错误,但这解决了我的问题。