【问题标题】:What is the point of mocking this Feign object?嘲笑这个 Feign 对象有什么意义?
【发布时间】:2019-06-04 15:53:53
【问题描述】:

我正在尝试为 Feign 客户端的实现编写单元测试。我不知道该怎么做,所以我用谷歌搜索了它并遇到了this 答案,接受的答案是这个代码 sn-p:

@Test
public someTestClient(){
    Person expectedPerson = new Person("name",12));
    when(mockPersonClient.getPerson()).return(expectedPerson);
    Person person = mockPersionClient.getPerson();
    assertEquals(expectedPerson, person);
}

我不明白为什么这是一个有用的测试,或者在什么情况下,除了 Person 构造函数的问题之外,这个测试可能会失败。这个测试本质上是不是相当于:

Person person = new Person("a", 1)
Person expectedPerson = new Person("a", 1)
assertEquals(person, expectedPerson)

我了解单元测试应该单独测试功能。这个测试会确保mockPersonClient 在运行时存在吗?

【问题讨论】:

    标签: java unit-testing mockito


    【解决方案1】:

    我们可以将模拟对象配置为在调用模拟对象的方法时始终返回一个硬编码的假对象。

    在这个例子中,配置了mockPersonClient.getPerson()的OP返回了一个假的Person。但是,他只是想知道为什么假的人在调用mockPersonClient.getPerson()时没有按照配置返回。我认为他展示的代码示例只是为了让他演示这个问题。这并不意味着他实际上编写了单元测试代码来测试一些生产代码。

    【讨论】:

      【解决方案2】:

      这样的测试没有任何价值。

      这是一个person,我将要求这个调用返回person,然后我会在调用它时检查我得到了person事物。当然你会得到person,你只是硬编码了它,那么它有什么用呢?

      单元测试是关于功能的,这是一个很多人都忽略的简单事实。 任何更改数据、过滤某些内容、以受控方式更改某些内容的代码都是单元测试的理想候选者。

      人们使用模拟有点过多,而且大部分时间都是为了错误的事情。是的,我们被建议针对接口进行编码,但这并不意味着您应该拥有一个非常复杂的系统,您可以在其中到处传递接口,然后您的测试代码会尝试模仿它。

      当你模拟太多时,这意味着你正在编写的测试与它测试的代码联系得太紧密了,它知道的太多了。单元测试不应该那样做,因为每次你以一些小的方式改变代码时,你就会发现现在你必须改变测试,因为你不再使用 35 个接口,现在你有 47 个接口可以模拟具体顺序。当您进行一次测试时,这可能不是问题,但想象一下当您进行 1000 次测试时会发生什么......

      如果人们试图以更多功能的方式编写代码,那么这将不会发生。如果您传递数据而不是抽象,那么您现在不必模拟任何东西。

      而不是模拟调用数据库,隔离它,获取结果并将其传递给一个方法,你只是失去了一个抽象,你的代码不需要模拟任何东西,你只需要调用方法,传递数据以您想要的任何格式,看看会发生什么。

      如果您想测试一个真实的数据库,那么您可以编写一个集成测试。这真的没那么复杂,嘲笑不应该是你做的第一件事,当它有帮助并且你真的必须做的时候就去做,但大多数时候,你真的不需要,如果你不这样做,事情就会变得简单。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-02-09
        • 1970-01-01
        • 2013-02-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-07
        • 2020-03-27
        相关资源
        最近更新 更多