我的公司不允许使用Mockito。在单元测试中验证。甚至有一个定制的声纳规则
规则如下
应该通过断言来验证结果,而不是使用“验证到执行”过程验证。因为如果我们验证流程,在流程更改后需要更多的努力来维护测试,但输入和输出保持不变。确保每一行代码都对结果有影响,并断言结果以证明逻辑正确
不合规代码示例
verify(graphics2D, times(1)).dispose();// Noncompliant
合规解决方案
assertThat(((SunGraphics2D) graphics2D).getSurfaceData()).isInstanceOf(NullSurfaceData.class);
对于数据库或中间件操作,断言使用嵌入式数据库或中间件成功写入数据。
对于restful请求,使用wiremock的verify断言模拟服务器收到了相应的请求
WireMock.verify(postRequestedFor(urlEqualTo("http://localhost:8080/query"))
.withHeader("Content-Type", equalTo("application/json"))
.withRequestBody(equalToJson("{" +
"\"testing-library\": \"WireMock\"," +
"\"creator\": \"Tom Akehurst\"," +
"\"website\": \"wiremock.org\"" +
"}")));
我的问题是,是否有其他IT公司有类似的规则来避免使用Mockito。在单元测试中验证?这是一个好规则还是一个坏规则?非常感谢你。
没有验证的断言只能在测试方法返回后检查结束状态。为了有一个完整的结束状态,你需要有所有的真实对象,没有模拟。使用的任何模拟都意味着您最终没有完整的状态,并且如果不使用验证,您无法检查应该检查的所有内容。所以,如果禁止使用验证,那么你根本不应该使用Mockito。您应该意识到您正在编写集成测试而不是单元测试。
但是,集成测试不会告诉您出了什么问题,以及在哪里查找根本原因:错误是在您的代码中还是在您正在使用的第三方库的代码中?你必须自己调查和调试才能找到答案。这就是为什么你需要真正的单元测试。
如果被测试的方法需要进行单元测试,这意味着测试应该测试该方法正在做什么,而不依赖于所调用的任何方法的实现。当被调用的方法在模拟中时,发送到模拟的数据通常不在任何位置,并且您无法验证调用中是否传递了正确的数据。您可以使用一个存储参数的应答对象来存根该方法,并在之后断言它们。但是,您只是在使用断言实现自己的验证方法。当调用的方法不是模拟方法时,测试将取决于该方法的实现,不再是单元测试。更改被调用方法的实现可能会中断许多调用该方法的方法的单元测试。
或者简而言之:如果你的公司不想让你使用验证,他们不想让你写单元测试,而是集成测试。
单元测试和集成测试都是有用的,它们相互补充。如果结构良好,两者都是可维护的。但是当您混合使用这两种类型(使用真实对象而不是模拟的单元测试或使用模拟的集成测试)时,测试变得难以维护。因此,对于集成测试,避免验证(和模拟)是一条好规则。对于单元测试来说,这是一个糟糕的规则,因为它使编写真正的单元测试变得不可能。
嗯,这需要一个很长的答案,但我会尽量简短。换公司。这基本上是两种不同的o型测试。在一种情况下,您正在检查输入和输出(assert),在另一种情况下,您的输出很可能是无效的,然后您只需验证函数是否被调用。
除此之外,您还可以在“集成测试”中使用verify,其中您希望验证函数是否被调用,还可能希望验证使用“inoder()”调用函数的顺序,如下所述:Mockito验证方法调用的顺序/顺序
有时单元测试和集成测试重叠。集成测试有2个子类型:
最近使用了一个maven插件,它允许在测试或验证阶段随意生成docker容器。
<groupId>io.fabric8</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.33.0</version>
这允许您在项目中的公共Jenkins管道中运行集成测试和端到端测试。唯一的问题出现在当您不能在Jenkins中使用docker时,因为docker没有安装在运行测试的机器上。
问题内容: Process p = Runtime.getRuntime().exec(command); is = p.getInputStream(); byte[] userbytes = new byte[1024]; is.read(userbytes); 我想从java在linux os中执行shell命令。但是Pmd报告说不要使用Java Runtime.exec()。为什么?是什么
问题内容: 通常我会尽可能避免转换类型,因为我认为这是不良的编码实践,并且可能会导致性能下降。 但是,如果有人要我解释为什么会这样,我可能会像前灯中的鹿一样看它们。 那么,为什么/何时铸造不好? 它对于Java,C#,C ++是通用的,还是每个不同的运行时环境都按照自己的方式处理? 欢迎使用任何语言的细节,例如为什么在c ++中不好? 问题答案: 您已经用三种语言标记了这三种语言,答案在三种语言之
问题内容: 假设我们在页面上有一个DIV ,并且想要将该DIV的内容复制(“复制粘贴”)到另一个DIV中。我们可以这样做: 或使用jQuery: 但是,看来此方法不是一个好主意,应避免使用。 (1)为什么要避免这种方法? (2)应该怎么做呢? 更新: 为了解决这个问题,我们假设DIV中没有ID为ID的元素。 (对不起,我忘了在原始问题中介绍此案。) 结论: 我已经在下面发布了我对这个问题的答案(如
在React中,我尝试了两种方法: 然后更改状态this.setState(this.state) 克隆状态,更改状态克隆,然后更改此.setState(stateClone) 它们都起作用,产生相同的结果。为什么建议(在文档中)设置为状态克隆(使用Object.assign),而不是设置为状态本身?状态的对象标识在React中重要吗(没有Redux)?似乎只要调用setState,不管状态对象标
对于与PropertyValueFactory相关的问题,许多回答(和评论)建议避免使用该类和其他类似类。使用这个类有什么问题?
问题内容: 我已经在多个地方多次看到过这种情况,但是从未找到令人满意的解释来说明为什么会这样。 因此,希望这里会介绍一个。为什么我们(至少通常)不使用和? 编辑:我看到人们以为这个问题与Web服务器有关,但事实并非如此。我可以理解为什么传递给未经处理的字符串可能很糟糕。在非Web应用程序中不好吗? 问题答案: 通常有更清晰,更直接的方法来获得相同的效果。如果构建复杂的字符串并将其传递给,则代码将难