首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何在单元测试中使用mockist方法来避免误报?

如何在单元测试中使用mockist方法来避免误报?
EN

Stack Overflow用户
提问于 2010-09-30 14:13:22
回答 3查看 472关注 0票数 3

由于我的应用程序域的数据结构最近变得相当复杂,所以我开始阅读模拟对象。很快,一个简单的问题出现在我的脑海中,但到目前为止,答案已经被证明是相当令人头疼的。所以这里是这样的:

我们有一个'Foo‘类,它的方法之一是'bar’:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Foo {
    public String bar(int i){
        if(i == 1) return "arrr!";
    }
}

我们有一个叫做Foo.bar(1)的盗版类,在它的一个方法中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Pirate {
    public String yell(){
        Foo foo = new Foo();
        return foo.bar(1);
    }

现在我们在Pirate类的单元测试中模拟Foo类,因为Foo恰好有太多的其他依赖项:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Test
public void returnsPirateString() {
    Pirate blackBeard = new Pirate();
    Foo fooMock = mock(Foo.class);
    fooMock.expectAndReturn("bar",1,"arrr!"); //expects 'bar' function to be called once and returns "arrr!"
    assertEquals(blackBeard.yell(),"arrr!");
}

现在发生的情况是,如果我们重构方法bar以返回null而不是"arrr!",我们的测试将继续愉快地运行,而我们的程序不会以我们想要的方式工作。这可能会导致可能的调试噩梦。

使用mockist方法而不是经典的测试方法进行单元测试,大多数时候所有的"helper“对象都会被模仿,只有被测试的对象保持未模仿状态,所以前面提到的问题也会经常发生。

如何在模拟时防止此问题?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-09-30 14:31:13

你也应该隔离测试“辅助对象”。一旦覆盖并测试了这两种方法,您就可以确保它们以预期的方式进行交互。

更改您的“辅助对象”应该通过对该辅助对象进行测试来确认它仍按预期运行。

如果您关心帮助器和主类组合的特定运行时行为,那么您应该使用集成测试或更高级别的其他测试来断言这两者可以按预期协同工作。

票数 2
EN

Stack Overflow用户

发布于 2010-09-30 14:31:46

在测试中,您将测试使用Foo的Pirate类的yell()方法。因此,您必须模拟Foo的bar方法的行为。为了确保bar方法正常工作,您需要另一个测试用例来测试Foo的bar方法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Test
public void testBar() {
   //make sure bar retrun "arrr"!
}

现在,如果您的bar方法返回null,则此测试用例将失败!

票数 3
EN

Stack Overflow用户

发布于 2010-09-30 14:49:22

测试returnsPirateString不是假阳性--它测试当PirateFoo实例返回'arrr!‘时会发生什么。

换句话说,当您测试Pirate.yell时,Foo.bar返回什么并不重要,除非它创建了一个特殊的边界条件(并且您可能已经有了一个测试,该测试记录了当Foo返回nullyell执行的操作)。

Pirate.yell不负责保证Foo.bar的任何特定返回值,因此它的单元测试不应该期望任何特定的返回values.You甚至应该特别注意更改测试以使用Foo.bar的当前返回值以外的其他值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3831400

复制
相关文章
避免 Swift 单元测试中的强制解析
强制解析(使用 !)是 Swift 语言中不可或缺的一个重要特点(特别是和 Objective-C 的接口混合使用时)。它回避了一些其他问题,使得 Swift 语言变得更加优秀。比如 处理 Swift 中非可选的可选值类型[1] 这篇文章中,在项目逻辑需要时使用强制解析去处理可选类型,将导致一些离奇的情况和崩溃。
网罗开发
2021/09/09
1.1K0
如何在 ClickHouse 中避免深度分页问题
在日常的业务场景中,我们经常会遇到查询 TOP N 的需求。在 ClickHouse 中,一种常见的实现 TOP N 的 SQL 模板如下所示:
Nauu
2020/05/29
8.7K1
如何在容器中避免CPU瓶颈限制
在 Uber,所有有状态的工作负载都运行在一个跨大型主机的通用容器化平台上。有状态工作负载包括 MySQL®、Apache Cassandra®、ElasticSearch®、Apache Kafka®、Apache HDFS™、Redis™、Docstore、Schemaless 等,并且在许多情况下,这些工作负载位于同一物理主机上。
从大数据到人工智能
2022/03/30
1.3K0
如何在容器中避免CPU瓶颈限制
如何在Java和Swift中避免空引用异常?
您最近在代码中遇到过NullPointerException(空指针异常)吗? 如果没有,那你一定是一个很细心的程序员。在Java应用程序中最常见的异常类型之一就是NullPointerExcepti
程序你好
2018/08/01
2.7K0
如何在Java和Swift中避免空引用异常?
如何在单元测试中使用 Dispatcher.Invoke/InvokeAsync?
发布于 2017-11-07 13:02 更新于 2018-08-19 11:08
walterlv
2018/09/18
1.4K0
如何在单元测试中使用 Dispatcher.Invoke/InvokeAsync?
如何在单元测试中设置系统环境变量
有时我们需要通过读取系统环境变量来获取一些有用的信息,比如系统路径、临时目录等。在系统真正运行的时候我们可以通过启动命令行,如:java -Dxxx.xxx=xxxx …,或者使用System.setProperty(“xxx.xxx”, “xxx.xxx”)来设置系统环境变量。但在单元测试时如何设置这些系统环境变量又成了一个让人头疼的问题。有些小伙伴是在setUp方法里设置,比如:
Allen Cheng
2018/09/10
8.1K0
如何在Java中避免equals方法的隐藏陷阱(二)
陷阱3:建立在会变化字段上的equals定义 让我们在Point类做一个非常微小的变化 public class Point { private int x; private int y; public Point(int x, int y) { this.x = x; this.y = y; } public int getX() { return x; } public int getY() {
java达人
2018/01/31
1.7K0
如何在踩踏事故中幸存,如何避免踩踏事故发生?
点击标题下「大数据文摘」可快捷关注 一月一日只是普通的一天。 很遗憾的是,在这普通的一天的清晨,我要写下这样一段文字。 踩踏,是一种极其原始的事故。每年东非大迁徙的过程中都有很多食草动物死于同类的蹄子之下。而人群的踩踏事故更是在史书上画下一个又一个血点。人类是天性爱群居的动物,人群就像磁铁一样对个人有着强大的吸引力。一旦人群聚集,并被街道、房屋、楼梯、栏杆压缩,危险就出现了。原本有序移动的人群可能会因为一个小小的诱因而瞬间崩溃,这个诱因可能是一只断掉的高跟鞋、洒在光滑地面上的一杯饮料、一股气味、一句话甚至
大数据文摘
2018/05/23
7090
如何在Android中避免创建不必要的对象
在编程开发中,内存的占用是我们经常要面对的现实,通常的内存调优的方向就是尽量减少内存的占用。这其中避免创建不必要的对象是一项重要的方面。
技术小黑屋
2018/09/05
2.5K0
如何在Java中避免equals方法的隐藏陷阱(一)
常见的等价方法陷阱 java.lang.Object 类定义了equals这个方法,它的子类可以通过重载来覆盖它。不幸的是,在面向对象中写出正确的equals方法是非常困难的。事实上,在研究了大量的Java代码后,2007 paper的作者得出了如下的一个结论: 几乎所有的equals方法的实现都是错误的! 这个问题是因为等价是和很多其他的事物相关联。例如其中之一,一个的类型C的错误等价方法可能意味着你无法将这个类型C的对象可信赖的放入到容器中。比如说,你有两个元素elem1和elem2他们都是类型C的对象
java达人
2018/01/31
1.8K0
单元测试最佳实践|如何避免常见陷阱?
单元测试的目的是为了随着时间的变化,系统能够按预期工作。一来系统质量得到了保证,开发人员能够提前发现和解决问题,不用身陷bug的泥潭无法自拔;二来开发人员有更多的时间和精力去完善自己技术、提升自己的生活质量,从而形成一个良性循环。
用户5166556
2023/03/18
9220
单元测试最佳实践|如何避免常见陷阱?
如何在案头研究中梳理出头绪,文献地图分析方法来了
作者:vincyxtwang  腾讯CDC高级用户研究员 |导语  本文介绍了文献可信度评估及通过文献地图分析方法进行案头研究,帮助在研究前期尽可能全面而又系统地在纷杂的案头研究中梳理出头绪,以得到洞察参考、帮助研究设计及报告撰写等。 前言 案头研究大家并不陌生,本文分享一下在行业研究中,前期在案头研究对文献进行分析时所运用到的文献地图分析方法,期望提供一种案头研究的文献分析思维方式,帮助在研究前期尽可能全面而又系统地在纷杂的文献中梳理出头绪,以得到洞察参考、帮助研究设计及报告撰写等。 本文所用示例主要基
腾讯大讲堂
2021/04/15
2.2K0
如何在 Python 编程学习中避免常见的错误和陷阱?
前几天在某乎上看到了一个粉丝提问,如何在 Python 编程学习中避免常见的错误和陷阱?这里拿出来跟大家一起分享下。
前端皮皮
2023/08/17
1720
如何在 Python 编程学习中避免常见的错误和陷阱?
如何在服务网格中避免复杂性问题
作者 | Chris Campbell 译者 | 张健欣 服务网格是 Kubernetes 世界的一个热门话题,但许多潜在的采用者已经失望地离开了。服务网格的采用受到了难以承受的复杂性和看似无穷无尽的供应商解决方案的限制。在我了解了这个领域之后,我发现采用服务网格有着巨大的价值,但它必须以轻量级的方式进行,以避免不必要的复杂性。尽管人们普遍感到失望,但服务网格的未来依旧光明。 边用边学 我进入服务网格的世界,始于我在一家历史悠久的财富 500 强科技公司担任云架构师。当我们开始实现服务网格时,我
深度学习与Python
2023/04/01
3490
如何在服务网格中避免复杂性问题
MongoDB使用update和save方法来更新集合中的文档
MongoDB 使用 update() 和 save() 方法来更新集合中的文档。接下来让我们详细来看下两个函数的应用及其区别。
用户4988376
2021/08/12
3.6K0
多线程中避免使用信号量
项目中遇到一个bug,因为接入了几家越狱平台:91、同步推、PP助手,在设备上安装了三个应用,启用其中任意一个,另外二个启动后无法创建发送socket消息,从而导致游戏直接死在登录那里,再次点击登录时线程才会被唤醒(无法发送的原因定位到,是因为在调用sem_post方法后无法将线程唤醒)。之后我尝试将信号量改为条件变量,就再也没有遇到那个问题了。具体改写的几个方法:
meteoric
2018/11/19
1.8K0
如何在单元测试中对写数据库进行测试?
转账是银行等金融系统中常见的一个场景。在在最近的一个针对转账服务的单元测试中,笔者就遇到了上述问题。一个极端简化的转账申请如下图:
Antony
2020/12/01
3.8K0
如何在单元测试中对写数据库进行测试?
MongoDB 中使用 drop() 方法来删除集合
如果成功删除选定集合,则 drop() 方法返回 true,否则返回 false。
用户4988376
2021/08/12
1.5K0
解决Win10中WerFault错误报告问题
下面就来说说如何安装gpedit.msc. 首先 在记事本上,输入以下信息 pushd “%~dp0”
全栈程序员站长
2022/07/04
6670
解决Win10中WerFault错误报告问题
点击加载更多

相似问题

如何在Fortify中避免误报“空引用”错误

25

如何使用音乐识别算法避免误报?

15

链接检查器;如何避免误报

12

模板匹配OpenCV时如何避免误报?

21

Modsecurity配置(避免误报SQL注入攻击)

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文