Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing 单元测试bean初始化_Unit Testing_Jakarta Ee_Mockito_Managed Bean_Postconstruct - Fatal编程技术网

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的状态有意义吗

向我们展示代码。服务从哪里来?为什么要使用CDI,这是一个依赖注入框架,其目的是通过注入协作者使代码易于测试,而仍然使用服务定位器,这使代码不稳定?我更新了代码。bean的基类包含服务定位器的实例。我不太确定这里使用的设计原则,因为这是遗留代码,所以这是我目前必须处理的。如果可能的话,我不会对现有的代码库进行更大的设计更改。在MyBean中插入一个模拟定位器,配置此模拟定位器以返回模拟服务,然后调用init()方法并测试它的性能。谢谢,这种方法似乎工作得很好。我之前考虑过这一点,但我想保持初始化方法的私有性。我想在bean中有一个public
@PostConstruct
方法是可以的。如果您愿意,您可以将其包设置为私有或受保护。