小编Rya*_*son的帖子

如何在没有equals方法的情况下断言两个类的相等性?

假设我有一个没有equals()方法的类,没有源.我想在该类的两个实例上断言相等.

我可以做多个断言:

assertEquals(obj1.getFieldA(), obj2.getFieldA());
assertEquals(obj1.getFieldB(), obj2.getFieldB());
assertEquals(obj1.getFieldC(), obj2.getFieldC());
...
Run Code Online (Sandbox Code Playgroud)

我不喜欢这个解决方案,因为如果早期的断言失败,我就不会得到完全相等的图片.

我可以自己手动比较并跟踪结果:

String errorStr = "";
if(!obj1.getFieldA().equals(obj2.getFieldA())) {
    errorStr += "expected: " + obj1.getFieldA() + ", actual: " + obj2.getFieldA() + "\n";
}
if(!obj1.getFieldB().equals(obj2.getFieldB())) {
    errorStr += "expected: " + obj1.getFieldB() + ", actual: " + obj2.getFieldB() + "\n";
}
...
assertEquals("", errorStr);
Run Code Online (Sandbox Code Playgroud)

这给了我完全平等的图片,但是很笨重(我甚至没有考虑到可能的零问题).第三种选择是使用Comparator,但compareTo()不会告诉我哪些字段失败相等.

有没有更好的做法从对象获得我想要的东西,没有子类化和覆盖equals(ugh)?

java junit unit-testing

82
推荐指数
8
解决办法
7万
查看次数

BDD真的适用于UI层吗?

BDD是一种"从外到内"的方法,据我所知,这意味着你从你所知道的开始.您编写故事和方案,然后实现最外层的域对象,"向内"和"故意"发现协作者,直到服务层,域层等为止.对于尚不存在的协作者,你嘲笑它(或"伪造它")直到你成功.(我直接从Dan North和Kent Beck窃取了一些这些术语).

那么,UI如何适应这个?

借用North的一篇博客文章,他重写了这一点:

Given an unauthenticated user
When the user tries to navigate to the welcome page
Then they should be redirected to the login page
When the user enters a valid name in the Name field
And the user enters the corresponding password in the Password field
And the user presses the Login button
Then they should be directed to the welcome page
Run Code Online (Sandbox Code Playgroud)

进入这个:

Given an unauthenticated user
When the user tries to …
Run Code Online (Sandbox Code Playgroud)

testing bdd

23
推荐指数
1
解决办法
6830
查看次数

在BDD中如何/如何模拟

我知道丹北的制订BDD的意图之一是移动的词汇从测试域的复杂性了.但是,在实现从外到内的方法时,似乎我们仍然需要对模拟行为(或者如果您愿意,还是存根行为)有所了解.North在这段视频中建议,如果我从最外层的域对象开始并向内工作,我会在发现它们时模拟协作者,然后用适当的实现替换它们.所以最后,我最终得到了一系列端到端测试.

Martin Fowler似乎在这篇博文中看到了一点不同,当时他定义了两个TDD阵营:"经典TDD"尽可能使用真实对象,必要时使用模拟,而"mockist TDD"在大多数情况下更喜欢模拟.他看到BDD倾向于后者.也就是说,在开发一个功能的最后,"mockist"方法会在实际测试中留下嘲笑(很遗憾在BDD讨论中使用该词).

公平地说,这两种材料都已经存在多年了,随着BDD在单元级应用和接受级别之间的界限发展,事情也变得更加清晰.

但我对社区的问题基本上是:当我的故事完成后,我的场景实际上应该进行多少端到端测试? North 解释说BDD需要抽象.例如,当我测试登录行为时,我的方案将详细说明登录过程的含义.但是,当我正在做其他需要但不是登录的场景时,我不想一遍又一遍地执行这些步骤.我想要一个简单的抽象,简单地说"鉴于我已登录",所以我可以执行我的其他行为.

因此,我的抽象方法似乎是我模拟某些协作者(或提供"测试双重"),并且某些场景可能比其他场景更多地使用它们.例如,我是否总是模拟外部资源,例如数据库或邮件服务器?

也许我问的是错误的问题.BDD就是沟通,缩短反馈周期,发现你不知道的东西.即使我们感兴趣的行为确实有效,也许什么也不是模拟是一个无关紧要的问题.我很好奇其他人的方法是什么.

testing bdd acceptance-testing

22
推荐指数
2
解决办法
3219
查看次数

将具有空值的键添加到Guava Multimap

我需要为一个带有空集合的Guava Multimap添加一个键作为值.我该如何做到这一点?

我试过这个:

map.put( "my key", null );
Run Code Online (Sandbox Code Playgroud)

但是调用get()会返回一个包含一个元素的列表,该列表为null.我通过以下方式解决了这个问题:

map.putAll("my key2", new ArrayList())
Run Code Online (Sandbox Code Playgroud)

但我想知道这是不是一件坏事吗?我知道当删除最后一个值时,Guava会自动删除一个键以保持containsKey()的一致性.我最好的选择是什么?

multimap guava

17
推荐指数
2
解决办法
6801
查看次数

Jenkins:如何在参数化构建中创建所需的参数?

在Jenkins中是否有一个参数化构建的插件来生成所需的参数?标准"此构建已参数化"选项下的字段似乎没有提供.

澄清:"必需"是指在字段填充值之前,构建不会执行.这显然会排除自动触发器.

continuous-integration jenkins

16
推荐指数
3
解决办法
1万
查看次数

如何判断是否安装了Python setuptools?

我正在编写一个快速的shell脚本,以便让我们的一些开发人员更轻松地运行Fabric.(我也是Python的新手.)安装Fabric的一部分是安装pip,安装pip的一部分是安装setuptools.

有没有简单的方法来检测是否已安装setuptools?我想让它可以多次运行脚本,它会跳过它已经完成的任何事情.现在看来,如果你连续两次运行ez_setup.py,你第二次就会失败.

我的一个想法是在/ Scripts文件夹下查找easy_install脚本.我可以使用sys.executable猜测Python根目录,然后交换可执行文件名称本身.但我正在寻找一些更优雅的东西(也许是跨OS友好的).有什么建议?

python pip setuptools

14
推荐指数
2
解决办法
6万
查看次数

如何在Gradle中指定本地Ivy仓库的相对路径?

我正在从Ant/Ivy迁移到Gradle,并试图了解您如何指定本地Ivy仓库的相对路径.Standalone Ivy ${ivy.default.ivy.user.dir}默认将变量设置.ivy2在用户主目录中,并将本地repo放在那里.

我可以模拟如下:

repositories {
    ivy {
        url "C:/Users/RYAN/.ivy2/local"
        layout 'pattern', {
            artifact "[organisation]/[module]/[revision]/[artifact](-[classifier])-[revision](.[ext])"
            ivy "[organisation]/[module]/[revision]/[artifact](-[classifier])-[revision](.[ext])"
    } 
}
Run Code Online (Sandbox Code Playgroud)

但我不想指定绝对路径.我看到有一个GRADLE_USER_HOME环境变量,但Gradle默认不设置它 - 我必须指定它命令行.

Gradle是否提供了访问默认本地Ivy仓库的方法?

ivy gradle

9
推荐指数
1
解决办法
4537
查看次数

我们如何处理BDD场景的次要排列?

我喜欢BDD的开发方法,但我已经开始担心要走多远.ThoughtWorks最新Radar的评论让我停下来:

"像Cucumber这样的行为驱动设计(BDD)测试框架的出现,加上像Selenium这样的浏览器自动化工具,已经鼓励在浏览器级别广泛使用验收测试.不幸的是,这鼓励进行大量的测试,其中运行的成本是测试是最大的.相反,我们应该在适当的水平测试,尽量靠近代码成为可能,从而使测试能够以最高效率运行.浏览器级别的测试应该是蛋糕上的糖霜,通过验收和单位的支持在适当的层执行测试."

所以这是我的场景(双关语):

我有一个基本的CRUD应用程序,其业务要求是根据最终用户可以选择的条件过滤显示的数据.为了便于讨论,我们假设它是电力公司的应用程序,我正在显示每个客户当前的月度电源使用情况.此应用的用户可以通过选择单个客户,多个客户,没有客户或"所有客户"来缩小数据范围.显示的数据将根据他们选择的内容而改变.

对于产品利益相关者,这些实际上代表了4个不同的场景.但是从开发人员的角度来看,它们是完全相同的,唯一的区别是传递给DB的参数.所以问题就变成了:每个排列拼写的好处是否超过运行和维护它们的成本?

我认为BDD原则可能会说"是",因为预期行为的传达更明确,但我不确定.它当然让我觉得有点矫枉过正.这些场景可能会有很多复制粘贴,只需稍作修改即可.

我的倾向是覆盖捕获核心业务价值("当我选择一个客户我看到电源使用数据")的单一场景此功能,再涂其他排列了一组非基于UI集成测试验证服务/查询返回正确的数据.这个想法错了吗?在不放弃BDD的好处的情况下,确保涵盖这些方案的最佳答案是什么?

bdd acceptance-testing

6
推荐指数
1
解决办法
774
查看次数

Java的代码覆盖率:死亡还是付费?

我正在寻找代码覆盖工具的答案.我知道之前有人问过这个问题的变化:

所以这可能是一个可怕的问题.但在大多数情况下,这些问题已有数年之久,我正在寻找是否有任何新工具出现.

我知道:

但据我所知(见下文),这两个开源项目基本上已经死了.付费解决方案是一种选择,但如果可能的话,我更喜欢开源.

开源基本上放弃了创新的代码覆盖软件,还是已经将能量带入了一些我不知道的新库?

的Cobertura

Latest version: 1.9.4.1, released 3/3/2010
Last commit: 1/7/2011
Run Code Online (Sandbox Code Playgroud)

艾玛

Latest version: 2.1.5320, released 6/22/2005
Last commit: (uses CVS, so there are no changesets, but commits are 6-8 years old)
Developer forums have only a handful of posts
Run Code Online (Sandbox Code Playgroud)

Latest version: 3.1.5, released 4/25/2012
Run Code Online (Sandbox Code Playgroud)

java code-coverage emma cobertura clover

4
推荐指数
1
解决办法
957
查看次数

如何在Gradle中指定依赖关系组的属性?

使用Gradle,我希望能够禁用一组依赖项的传递性,同时仍允许其他依赖项.像这样的东西:

// transitivity enabled
compile(
  [group: 'log4j', name: 'log4j', version: '1.2.16'],
  [group: 'commons-beanutils', name: 'commons-beanutils', version: '1.7.0']
)

// transitivity disabled
compile(
  [group: 'commons-collections', name: 'commons-collections', version: '3.2.1'],
  [group: 'commons-lang', name: 'commons-lang', version: '2.6'],
) { 
  transitive = false
}
Run Code Online (Sandbox Code Playgroud)

Gradle不接受此语法.如果我这样做,我可以让它工作:

compile(group: 'commons-collections', name: 'commons-collections', version: '3.2.1') { transitive = false }
compile(group: 'commons-lang', name: 'commons-lang', version: '2.6']) { transitive = false }
Run Code Online (Sandbox Code Playgroud)

但是,当我宁愿将它们组合在一起时,这需要我在每个依赖项上指定属性.

有人建议使用可以解决此问题的语法吗?

build dependency-management gradle

2
推荐指数
1
解决办法
4801
查看次数