Mockito - Mock没有被注入其中一个测试用例

时间:2015-03-05 12:19:59

标签: java spring unit-testing junit mockito

我有一个jsf spring应用程序并使用 mockito 进行单元测试。当我在NullPointerException模拟中运行junit测试时,我不断获得iEmployeeServiceException没有iSecurityLoginService

要模拟的方法

@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();
}

4 个答案:

答案 0 :(得分:7)

与问题无关,但知道有用!

如果测试使用@RunWith(MockitoJUnitRunner.class)进行注释,则MockitoAnnotations.initMocks(this);不是必需的(注入时甚至可能会导致问题),模拟运行器执行注入和其他操作以验证模拟。

同时拥有两个模拟初始化机制可能会导致注入和存根问题,这是由于JUnit测试的生命周期以及如何使用mockito单元集成代码的方式:

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

答案 1 :(得分:5)

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

Ex:在我的豆里,

@Autowired
IEmployeeService employeeService;
@Autowired
IEmployeeService iEmployeeService;

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

@Mock
IEmployeeService iEmployeeService;

即,模拟对象&#39; iEmployeeService&#39;被注入豆类&employee员工服务&#39;

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

答案 2 :(得分:2)

尝试添加此

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

答案 3 :(得分:0)

我遇到了类似的问题,经过很少的研究,我发现@InjectMocks在没有注入@AutoWired 私有对象的情况下无法正常工作,并且无声地失败了,< / p>

解决方案:通过在构造函数中显示依赖项来更改设计,

IEmployeeService iEmployeeService;
ISecurityLoginService iSecurityLoginService;

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

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