单元测试bean初始化

时间:2015-06-09 09:28:42

标签: unit-testing java-ee mockito managed-bean postconstruct

我有一个@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是否使用这些服务正确初始化。我的问题是:

  • 解决此问题的最佳方法是什么?
  • 有没有更好的方法来设计bean,以便可以轻松测试其初始化状态?
  • 在单元测试中测试bean的状态是否有意义?

0 个答案:

没有答案