i有一个init()方法,它使用注入私有实例<>。如何使用Junit或Mockito测试该课程?我试图做一些假班,并将它们添加到列表中,并将此列表设置为我的私人字段,但我有此错误
java.lang.illegalargumentException:无法设置javax.enterprise.inject.inject.instance字段......
myclass是:
@Singleton
@Startup
public class HandlerManager {
@Any
@Inject
private Instance<RollbackHandler<RollbackData>> handlers;
private RollbackHandler<RollbackData> rollbackHandler;
@PostConstruct
public void init() {
for (RollbackHandler<RollbackData> bean : handlers) {
//do something
}
}
}
除非您使用自定义工作,否则任何注释均不会通过框架处理。您必须使用@mock在测试中调用测试方法(例如setup()之前,将所有这些依赖项定义为测试中的模拟。这是一个多部分问题。
- 使用构造仪注入,现场注射是邪恶的。您仍然可以用@Inject注释您的构造函数。
when(provider.iterator()).thenReturn(list.iterator);
为我工作。
您可以使用RollbackHandler
的具体实现创建一个临时列表,并模拟Instance<RollbackHandler<RollbackData>>
对象的iterator()
方法,以便它返回临时列表的迭代器。
示例:
private void mockIterator() {
Instance<RollbackHandler<RollbackData>> handlers = mock(Instance.class);
List<RollbackHandler<RollbackData>> handlersList = Collections.singletonList(new RollbackHandlerImpl<>());
when(handlers.iterator()).thenReturn(handlersList.iterator());
}