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