嘲笑这个假的对象有什么意义?

时间:2019-06-04 15:53:53

标签: java unit-testing mockito

我正在尝试为Feign客户端的实现编写单元测试。我不确定该怎么做,因此我在Google上搜索了this答案,然后接受的答案是以下代码段:

@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在运行时存在?

2 个答案:

答案 0 :(得分:0)

我们可以将模拟对象配置为在对该模拟对象调用方法时始终返回硬编码和伪造的对象。

在此示例中,配置为Time : 07:30-08:30 TPA-1 Class : E-1 |------------|--------------|------------| |Student ID | Student Name | Status | |------------|--------------|------------| |1012836001 | Vanessa | Check None | |1012836002 | Kesya | Check None | |3012836003 | Charissa | Check None | |------------|--------------|------------| Time : 08:30-09:30 TPA-1 Class : E-1 |------------|--------------|------------| |Student ID | Student Name | Status | |------------|--------------|------------| |1012836001 | Vanessa | Check None | |1012836002 | Kesya | Check None | |3012836003 | Charissa | Check None | |------------|--------------|------------| Time : 07:30-08:30 FIS-1 Class : E-2 |------------|--------------|------------| |Student ID | Student Name | Status | |------------|--------------|------------| |1012836004 | Drex | Check None | |3012836005 | Vulcano | Check None | |------------|--------------|------------| Time : 08:30-09:30 FIS-1 Class : E-2 |------------|--------------|------------| |Student ID | Student Name | Status | |------------|--------------|------------| |1012836004 | Drex | Check None | |3012836005 | Vulcano | Check None | |------------|--------------|------------| Time : 10:00-11:00 FIS-1 Class : E-1 |------------|--------------|------------| |Student ID | Student Name | Status | |------------|--------------|------------| |1012836001 | Vanessa | Check None | |1012836002 | Kesya | Check None | |3012836003 | Charissa | Check None | |------------|--------------|------------| Time : 11:00-12:00 FIS-1 Class : E-1 |------------|--------------|------------| |Student ID | Student Name | Status | |------------|--------------|------------| |1012836001 | Vanessa | Check None | |1012836002 | Kesya | Check None | |3012836003 | Charissa | Check None | |------------|--------------|------------| 的OP返回伪造的mockPersonClient.getPerson()。但是,他只是想知道为什么伪造的人在致电Person时没有按配置返回。我认为他展示的代码示例只是为了证明这个问题。这并不意味着他实际上写了单元测试代码来测试一些生产代码。

答案 1 :(得分:0)

类似的测试没有任何价值。

这里是一个 person ,我要问这个电话是否返回 person ,然后我会在呼叫该电话时检查是否得到了 person 事情。当然,您会得到 person ,您只需对其进行硬编码,那么它有什么用?

单元测试与功能有关,这是一个简单的事实,许多人都没有想到。 任何更改数据,过滤内容,以受控方式更改内容的代码都是单元测试的理想选择。

人们对模拟的使用过多,并且在大多数情况下会使用错误的东西。是的,建议我们针对接口进行编码,但这并不意味着您应该拥有一个非常复杂的系统,即您在各处传递接口,然后您的测试代码试图模仿该接口。

当您进行过多的模拟时,这意味着您正在编写的测试与它所测试的代码有太多的联系,它对此了解太多。单元测试不应该这样做,因为每次以较小的方式更改代码时,您都会发现现在必须更改测试,因为您不再使用35个接口,现在您可以使用47个接口进行模拟了。具体顺序。当您进行一次测试时,这可能不是问题,但请想象一下,如果您进行1000次测试,会发生什么...

如果人们尝试以更多的功能性方式进行编码,则不会发生这种情况。如果您传递数据而不是抽象,那么您现在不必模拟任何东西。

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

如果要测试真实的数据库,请编写一个集成测试。其实并没有那么复杂,嘲笑不应该是您要做的第一件事,当它确实有用时就应该这样做,但是在大多数情况下,您实际上不这样做,如果不这样做,它会简化事情。