Unit testing 单元测试bean初始化
我有一个Unit testing 单元测试bean初始化,unit-testing,jakarta-ee,mockito,managed-bean,postconstruct,Unit Testing,Jakarta Ee,Mockito,Managed Bean,Postconstruct,我有一个@SessionScopedbean,它通过调用各种服务(通过服务定位器访问)在构造时进行一些初始化。我想测试bean创建后的初始化状态是否正确 bean的外观如下所示: @ManagedBean @SessionScoped public class MyBean extends MyBeanBase { public MyBean(){ init(); } private void init(){ //call servic
@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
}
...
}
@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();
...
}
...
}
类MyBeanBase
包含一个MyServiceLocator
的单例实例,该实例公开了一些服务:
@ManagedBean(name="...")
@ApplicationScoped
public class MyServiceLocator{
@EJB
private Service1 service1;
@EJB
private Service2 service2;
...
// getters for services
}
我使用Mockito mocking框架进行单元测试。我最初的想法是模拟在构造函数中被调用的服务,并将这些模拟注入bean实例,但这不起作用,因为Mockito需要类的实例才能开始模拟,但服务方法在构造函数中被调用
我的第二个想法是将bean初始化移动到@PostConstruct
方法中,如下所示:
@ManagedBean
@SessionScoped
public class MyBean extends MyBeanBase {
public MyBean(){
init();
}
private void init(){
//call service-methods to initialize some fields of the bean
}
...
}
@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是否使用这些服务正确初始化。我的问题是:
- 解决这个问题的最佳方法是什么
- 有没有更好的方法来设计bean,以便能够轻松测试其初始化状态
- 在单元测试中测试bean的状态有意义吗
@PostConstruct
方法是可以的。如果您愿意,您可以将其包设置为私有或受保护。