Mockito - 没有为其中一个测试用例注入模拟
Mockito - Mock not being injected for one of the testcases
我有一个 jsf spring 应用程序并使用 mockito 进行单元测试。当我在 iEmployeeService
模拟中 运行 我的 junit
测试时,我一直得到 NullPointerException
。 iSecurityLoginService
没有 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 单元集成代码的使用方式所致:
- 运行器将创建模拟并将这些模拟注入测试对象。
- 然后
@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 方法,不确定是否是错误,但这解决了我的问题。
我有一个 jsf spring 应用程序并使用 mockito 进行单元测试。当我在 iEmployeeService
模拟中 运行 我的 junit
测试时,我一直得到 NullPointerException
。 iSecurityLoginService
没有 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 单元集成代码的使用方式所致:
- 运行器将创建模拟并将这些模拟注入测试对象。
- 然后
@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 方法,不确定是否是错误,但这解决了我的问题。