Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.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/1/asp.net/32.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
Java 编译时模拟_Java_Mocking_Seam_Integration Testing_Mockito - Fatal编程技术网

Java 编译时模拟

Java 编译时模拟,java,mocking,seam,integration-testing,mockito,Java,Mocking,Seam,Integration Testing,Mockito,我正在使用一些遗留代码,我需要测试是否调用了一些昂贵的服务(它进行网络呼叫、发送电子邮件等) 我能够通过使用中的框架(JBossSeam2)注入一个假的服务,而不是原来的服务。见这个问题: 我现在希望我的伪对象是一个更智能的mock来断言它是否被调用,等等。我希望它是一个Mockito或Easymock或其他一些东西mock。但是,在测试中以经典的方式构造模拟,然后注入它,由于seam 2和seam测试处理注入的方式,因此不起作用。请参阅上面的链接 问题:有没有一种方法可以让我的mock扩展或被

我正在使用一些遗留代码,我需要测试是否调用了一些昂贵的服务(它进行网络呼叫、发送电子邮件等)

我能够通过使用中的框架(JBossSeam2)注入一个假的服务,而不是原来的服务。见这个问题:

我现在希望我的伪对象是一个更智能的mock来断言它是否被调用,等等。我希望它是一个Mockito或Easymock或其他一些东西mock。但是,在测试中以经典的方式构造模拟,然后注入它,由于seam 2和seam测试处理注入的方式,因此不起作用。请参阅上面的链接


问题:有没有一种方法可以让我的mock扩展或被注释,从而成为Mockito或mock?我怎样才能在考试中得到它的参考呢?

我不同意你所链接问题的答案。单元测试应该独立于它应该工作的环境来测试类。依赖项注入框架正是用来在单元测试中注入模拟依赖项,而不需要任何复杂的环境来运行单元测试

我不知道Seam,但它的文档说@In可以放在属性访问器上。我只需要对类进行如下测试:

public class someBean implements Serializable {
    private ApplicationBean applicationBean

    @In
    protected void setApplicationBean(ApplicationBean applicationBean) {
        this.applicationBean = applicationBean;
    }
    ...
}
我只需要调用setter在单元测试中注入mock


您也可以让代码保持原样,但提供一个setter或一个额外的构造函数,以便能够注入一个模拟applicationBean。

您需要一个具有相同名称但优先级更高的类。我已经做了很多这样的模拟

您为您的mock类指定相同的@name,并定义@install(优先级=mock)。一旦这个类在类路径中,它就会被用来代替普通类(如果我没记错的话,优先级默认值是application)。
我现在还没有准备好代码,但我模拟了facesmessage,例如,在测试期间,我可以从这个类中读取这些消息并验证它们。

我同意,但我已经尝试过这种方法,注入没有起作用。链接的问题/答案基于seam参考。我会再次尝试你的建议,也许我遗漏了一些小东西:)这样的东西怎么可能不起作用:
ApplicationBean mockApplicationBean=mock(ApplicationBean.class);SomeBean SomeBean=新的SomeBean();setApplicationBean(mockApplicationBean)它是普通的旧Java。如果它不工作,那么setter有一个bug。Seam根本不用于这种方法。它似乎可以工作,没有例外,但它使用的是普通类而不是模拟类。如果ApplicationBean是一个具体类,并且您不配置模拟来执行具体类以外的任何操作,那么当然会使用真正的方法。您需要在使用模拟之前配置它:
when(mockApplicationBean.someMethod())。然后返回(5)我设法使它工作。Seam依赖在每次方法调用之前注入字段(我正在进行集成测试)。因此,在调用action方法之前执行setApplicationBean是没有用的。但在注入时,它会在其上下文(事件、请求、会话等)中搜索现有组件。解决方案是在对话上下文中将真实组件替换为模拟组件。谢谢你让我走上正轨。