我已经阅读过各种关于模拟和测试中存根的文章,包括Martin Fowler的Mocks Are Not Stubs,但仍然不明白其中的区别.
我正在尝试编译由IBM的WSDL2Java在Java5上创建的Java 1.4代码,而无需重新创建存根并在Eclipse中看到此错误.我假设创建的存根应该只要运行时jar可用就可以编译(它们是).
Access restriction: The type QName is not accessible due to restriction on required library C:\Program Files\Java\jdk1.5.0_16\jre\lib\rt.jar
完整的类名是 javax.xml.namespace.QName
到底发生了什么?
这是我试图用香肠重构一头猪的情况吗?我最好重新创建存根吗?
我知道我如何使用这些术语,但我想知道是否有单独测试的伪造,模拟和存根的可接受定义?你如何为你的测试定义这些?描述您可能使用每种情况的情况.
以下是我如何使用它们:
假:一个实现接口但包含固定数据而没有逻辑的类.根据实施情况,简单地返回"好"或"坏"数据.
Mock:一个实现接口的类,允许动态设置值以返回/异常从特定方法抛出,并提供检查是否已调用/未调用特定方法的功能.
存根:类似于模拟类,但它不提供验证方法是否已被调用/未调用的能力.
模拟和存根可以由模拟框架手动生成或生成.伪造的类是手工生成的.我主要使用模拟来验证我的类和依赖类之间的交互.一旦我验证了交互并且正在通过我的代码测试备用路径,我就会使用存根.我主要使用假类来抽象出数据依赖性,或者每次使用模拟/存根都太繁琐.
因此,继续我的新年决议以获得更多TDD,我现在开始更多地使用Rhino Mocks.
我真正想要做的一件事就是确保我真正了解我所要做的事情,所以我想检查一下我对目前所看到的情况的理解(我认为最好把它放在这里作为一个资源).
例如,这句话是什么意思?
在任何现代Web应用程序中,与外部API集成几乎是一种保证.要有效地测试此类集成,您需要将其存根.一个好的存根应该易于创建,并且始终与实际的当前API响应保持同步.在这篇文章中,我们将概述使用存根的外部API 的测试策略.
我不明白Spock测试中Mock,Stub和Spy之间的区别,我在网上看过的教程并没有详细解释它们.
我想存根process.env.FOO
使用bar
.
var sinon = require('sinon');
var stub = sinon.stub(process.env, 'FOO', 'bar');
Run Code Online (Sandbox Code Playgroud)
我糊涂了.我看过文件,但我还是不明白.sinonjs docs
sinonjs是一个例子,不是sinonjs没关系.
我有一个模型Family,location
它有一个合并location
其他对象的成员的方法,成员.(成员与家庭有关,但这在这里并不重要.)
例如,给定
location
=='圣地亚哥(旅游,5月15日返回)'location
=='圣地亚哥'Family.location可能会返回'圣地亚哥(member_1旅行,5月15日返回)'细节不重要.
为了简化Family.location的测试,我想要存根Member.location.但是,我需要它返回两个不同的(指定的)值,如上例所示.理想情况下,这些将基于属性member
,但只是在序列中返回不同的值就可以了.在RSpec有办法做到这一点吗?
可以在每个测试示例中覆盖Member.location方法,例如
it "when residence is the same" do
class Member
def location
return {:residence=>'Home', :work=>'his_work'} if self.male?
return {:residence=>'Home', :work=>'her_work'}
end
end
@family.location[:residence].should == 'Home'
end
Run Code Online (Sandbox Code Playgroud)
但我怀疑这是好习惯.在任何情况下,当RSpec运行一系列示例时,它不会恢复原始类,因此这种覆盖"毒药"后续示例.
那么,有没有办法让stubbed方法在每次调用时返回不同的指定值?
在我的测试中,我想为任何类的实例存根固定响应.
它可能看起来像:
Book.stubs(:title).any_instance().returns("War and Peace")
Run Code Online (Sandbox Code Playgroud)
然后,每当我打电话,@book.title
它就会返回"战争与和平".
有没有办法在MiniTest中执行此操作?如果是的话,你能给我一个示例代码片段吗?
或者我需要像摩卡这样的东西?
MiniTest确实支持Mocks,但Mocks对于我需要的东西来说太过分了.
在使用RSpec时是否有任何方法可以删除任何存根和模拟?
例:
RestClient.should_receive(:delete).with("http://www.example.com")
...
...
# this will remove the mocking of "should_receive" and
# restore the proper "delete" method on "RestClient".
RestClient.mocking_reset
Run Code Online (Sandbox Code Playgroud)
(mocking_reset
是我所需功能的虚构名称).
我知道有一种方法"unstub"可以重置"stubs"而不是"should_receive".
那么,有没有任何方法相当于"unstub"而是"should_receive"?
Panayotis