我有一个@SessionScoped
bean,它通过调用各种服务(通过服务定位器访问)在构造时进行一些初始化。我想测试创建后bean的初始化状态是否正确。
bean看起来像这样:
@ManagedBean
@SessionScoped
public class MyBean extends MyBeanBase {
public MyBean(){
init();
}
private void init(){
//call service-methods to initialize some fields of the bean
}
...
}
类MyBeanBase
包含公开某些服务的MyServiceLocator
的单例实例:
@ManagedBean(name="...")
@ApplicationScoped
public class MyServiceLocator{
@EJB
private Service1 service1;
@EJB
private Service2 service2;
...
// getters for services
}
我使用Mockito模拟框架进行单元测试。我最初的想法是模拟在构造函数中调用的服务并将这些模拟注入到bean实例中,但这不起作用,因为Mockito需要类的实例才能开始模拟,但服务方法被调用在构造函数本身。
我的第二个想法是将bean初始化转换为@PostConstruct
方法,如下所示:
@ManagedBean
@SessionScoped
public class MyBean extends MyBeanBase {
private MyType field1;
...
@PostConstruct
private void init(){
//call service-methods to initialize some fields of the bean
field1 = getService1().getValue();
...
}
...
}
我阅读了一些讨论此案例的其他主题并建议使用SpringJUnit4ClassRunner
和@Autowired
,但我不能100%确定在这种情况下这是否正确。
所以基本上我想做的是使用模拟服务来测试bean是否使用这些服务正确初始化。我的问题是: