我知道我如何使用这些术语,但我想知道是否有单独测试的伪造,模拟和存根的可接受定义?你如何为你的测试定义这些?描述您可能使用每种情况的情况.
以下是我如何使用它们:
假:一个实现接口但包含固定数据而没有逻辑的类.根据实施情况,简单地返回"好"或"坏"数据.
Mock:一个实现接口的类,允许动态设置值以返回/异常从特定方法抛出,并提供检查是否已调用/未调用特定方法的功能.
存根:类似于模拟类,但它不提供验证方法是否已被调用/未调用的能力.
模拟和存根可以由模拟框架手动生成或生成.伪造的类是手工生成的.我主要使用模拟来验证我的类和依赖类之间的交互.一旦我验证了交互并且正在通过我的代码测试备用路径,我就会使用存根.我主要使用假类来抽象出数据依赖性,或者每次使用模拟/存根都太繁琐.
我在这里读了几个关于静态方法的线程,我想我明白了误用/过度使用静态方法会导致的问题.但我并没有真正了解为什么很难模拟静态方法.
我知道其他嘲笑框架,如PowerMock,可以做到这一点,但为什么不能Mockito?
我读过这篇文章,但作者似乎在虔诚地反对这个词static,也许这是我理解不足的原因.
一个简单的解释/链接将是伟大的.
从Android Studio 1.1rc开始,有单元测试支持,我想知道Android Instrumentation测试和单元测试之间有什么区别.
据我了解:
单元测试对于测试不调用Android API的代码非常有用,而Android测试测试则是集成测试,用于测试Android API特定元素或GUI组件.
但是,如果你在单元测试中使用像Robolectric或Mockito这样的框架,你可以测试Android代码(不需要设备)如果我没有弄错的话.
这是正确的,还是有更大的区别?如果是这样,每个人的用途是什么?
testing android integration-testing unit-testing android-studio
我在我的项目中使用了更多的单元测试并阅读了我可以在线获取的所有信息,并且很多术语让我感到困惑.因此,我可能在对话和谷歌搜索中错误地使用这些术语.
有人可以概述所有单元测试术语,如"假"类型以及测试类型(交互与集成)?
如果我尝试模拟包含如下async方法的类型:
interface Foo
{
Task<int> Bar();
}
Run Code Online (Sandbox Code Playgroud)
然后mock的Bar方法返回null.我猜Moq正在选择default(Task<int>)我的方法的默认返回值,这确实是null.然而,Moq应该选择像Task.FromResult(default(int))默认值这样的东西.我可以强制Moq使异步方法返回非空任务吗?
我是Node.js,Mongoose的新手,并且在这个环境中进行测试.我在单独的文件中声明了以下架构.
Issue = mongoose.model("Issue", {
identifier: String,
date: String,
url: String,
name: String,
thumbnailURL: String
});
Run Code Online (Sandbox Code Playgroud)
然后我有这个方法,只返回IssueMongoDB集合中的所有实例.
function issues(request, response) {
response.setHeader('Content-Type', 'text/json');
Issue.find().sort('date').exec(function(error, items) {
if (error) {
response.send(403, {"status": "error", "error:": exception});
}
else {
response.send(200, {"issues": items});
}
});
}
Run Code Online (Sandbox Code Playgroud)
我已经通过实验得到了这一点,现在我想测试它,但我遇到了一个问题.如何在不设置MongoDB连接的情况下进行测试,我知道我可以设置所有这些内容,但这是一个集成测试.我想编写单元测试来测试以下内容:
date字段排序我很想知道如何重构我现有的代码以使其更具单元可测试性.我尝试过创建第二个被调用的函数,接受response和Item架构对象作为参数,但感觉不对.有谁有更好的建议?
我曾经使用过JUnit和Mocks,但我想知道,JUnit中的Mocks和Stubs之间有什么区别,以及如何在JUnit,Java中使用Stubs?而作为拥有EasyMock,Mockito等的Mocks,Stubs在Java中使用了什么?
请给出Java中Stubs的一些示例代码.
假设我有一个非常简单的网络应用程序,如果现任总统是民主党人,则呈现为蓝色,如果他们是共和党人,则呈现红色.REST API用于通过端点获取当前的总裁:
/presidents/current
Run Code Online (Sandbox Code Playgroud)
它当前返回json对象:
{name: "Donald Trump", party: "Republican"}
Run Code Online (Sandbox Code Playgroud)
因此,当我的页面加载时,我会调用端点,并根据返回的人显示红色或蓝色.
我希望测试这个HTML/javascript页面,我希望模拟后端,以便我可以在测试环境中控制API响应.例如:
def test_republican():
# configure the response for this test that the web app will receive when it connects to this endpoint
configure_endpoint(
"/presidents/current",
jsonify(
name="Donald Trump",
party="Republican"
)
)
# start the web app in the browser using selenium
load_web_app(driver, "http://localhost:8080")
e = driver.find_element_by_name("background")
assert(e.getCssValue("background-color") == "red")
def test_democrat():
# configure the response for this test that the web app will receive when it connects to this endpoint
configure_endpoint( …Run Code Online (Sandbox Code Playgroud) 这篇博客文章说:
虽然有时候有一些明智的方法可以在没有DI的情况下模拟对象(通常是通过模拟类方法,如上面的OCMock示例所示),但它通常是不可能的.即使有可能,测试设置的复杂性也可能超过其好处.如果你一直使用依赖注入,你会发现使用存根编写测试并且模拟会更容易.
但它没有解释原因.id在简单的OCMockito 中,DI(注入符合协议的对象)在Objective-C中更适合模拟的可能场景是什么?
[given([mockArray objectAtIndex:0]) willReturn:@"first"];
[verifyCount(mockArray, times(1)) objectAtIndex:];
Run Code Online (Sandbox Code Playgroud)
?
我有一个场景,我必须设置一个模拟对象的属性,如下所示:
SlingHttpRequest slingHttpRequest= mock(SlingHttpRequest);
slingHttpRequest.setAttribute("search", someObject);
Run Code Online (Sandbox Code Playgroud)
当我尝试打印此属性时,我得到了null.我该如何设置此属性?
我有一个ember服务,主要关注的是获取特定模型和模型后代的数据.我在服务中使用它的原因是因为此特定类型的路由使用的是不是主键的slug,因此需要执行store.query而不是store.find.当我们获取这个模型时,我有一些逻辑可以查看ember存储,看看我们是否可以在进入api查询之前从那里加载它.此供应商也在关注段塞更改并基于此更新当前模型.
我遇到的问题是,在涉及如何测试这样的事情时,这似乎只有很少的文档.事实上,我没有在指南中的任何地方看到有关测试服务的部分http://guides.emberjs.com/v2.1.0/
这是有问题的服务的片段.
import Ember from 'ember';
export default Ember.Service.extend({
_vendorSlug: null,
vendor: null,
vendorSlug: function (key, value) {
if (arguments.length > 1) {
if (this._vendorSlug) {
return this._vendorSlug;
}
this._vendorSlug = value;
}
return this._vendorSlug;
}.property(),
ensureVendorLoaded: function (slug) {
var service = this,
vendorSlug = slug || service.get('vendorSlug'),
currentVendor = service.get('vendor'),
storedVendor;
if (!Ember.isNone(currentVendor) && (vendorSlug === currentVendor.get('slug'))) {
return new Ember.RSVP.Promise((resolve) => {
resolve(currentVendor);
});
} else {
var storedVendors = service.store.peekAll('vendor').filter((vendor) …Run Code Online (Sandbox Code Playgroud) 我有一个像这样的控制器类
public void create(int a, int b){
//do something
}
Run Code Online (Sandbox Code Playgroud)
现在我想模拟 Controller 类并在调用我模拟的 Controller 类的 create 方法时为示例 doCustomCreate() 调用某个方法。
我的测试看起来像这样
Controller ctrlMock = mock(Controller.class);
//PseudoCode: when(isCalled(ctrlMock.create(a,b)).doCall(doCustomCreate());
Run Code Online (Sandbox Code Playgroud)
我只阅读了带有输入和返回值的模拟方法,所以我想知道这是否可能?
编辑:更新了问题
unit-testing ×6
mocking ×5
java ×4
junit ×3
mockito ×3
stub ×2
android ×1
async-await ×1
c# ×1
definition ×1
ember-cli ×1
ember-data ×1
ember-qunit ×1
ember.js ×1
ios ×1
jasmine ×1
methods ×1
mongodb ×1
mongoose ×1
moq ×1
node.js ×1
objective-c ×1
python ×1
rest ×1
static ×1
terminology ×1
testing ×1