我有一个jsf spring应用程序并使用 mockito 进行单元测试。当我在NullPointerException
模拟中运行junit
测试时,我不断获得iEmployeeService
。 Exception
没有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();
}
答案 0 :(得分:7)
与问题无关,但知道有用!
如果测试使用@RunWith(MockitoJUnitRunner.class)
进行注释,则MockitoAnnotations.initMocks(this);
不是必需的(注入时甚至可能会导致问题),模拟运行器执行注入和其他操作以验证模拟。
同时拥有两个模拟初始化机制可能会导致注入和存根问题,这是由于JUnit测试的生命周期以及如何使用mockito单元集成代码的方式:
@Before
方法启动并重新创建新的模拟,并且可能不会执行注入,因为对象已经初始化。答案 1 :(得分:5)
我解决了问题。在我的spring bean中,我有2个对象用于相同的服务接口。所以模拟被设置为第一个接口对象。
Ex:在我的豆里,
@Autowired
IEmployeeService employeeService;
@Autowired
IEmployeeService iEmployeeService;
因此,IEmployeeservice接口的模拟创建正在为第一个与其名称无关的服务对象注入。
@Mock
IEmployeeService iEmployeeService;
即,模拟对象' iEmployeeService'被注入豆类&employee员工服务'
感谢所有帮助过的人.. :)
答案 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
个对象