据我理解,代码测试是测试结果是否正确,就像计算器一样,我需要编写一个测试用例来验证1+1的结果是否为2。
但是,我读过许多关于验证方法调用次数的测试用例。我对此很困惑。最好的例子就是我刚才在“春天行动”中看到的
public class BraveKnight implements Knight {
private Quest quest;
public BraveKnight(Quest quest) {
this.quest = quest;
}
public void embarkOnQuest() {
quest.embark();
}
}
public class BraveKnightTest {
@Test
public void knightShouldEmbarkOnQuest() {
Quest mockQuest = mock(Quest.class);
BraveKnight knight = new BraveKnight(mockQuest);
knight.embarkOnQuest();
verify(mockQuest, times(1)).embark();
}
}我真的不知道为什么他们需要验证embark()函数被一次调用。您不认为embark()在调用embarkOnQuest()之后一定会被调用吗?或者会发生一些错误,我会注意到日志中的错误消息,它显示了错误行号,这可以帮助我快速找到错误的代码。
那么,像上面这样验证有什么意义呢?
发布于 2018-09-07 12:31:23
需要做的很简单:验证调用的正确次数。在某些情况下,不应该发生方法调用,而在其他情况下,它们应该或多或少地发生在默认情况下。
考虑以下修改后的embarkOnQuest版本
public void embarkOnQuest() {
quest.embark();
quest.embarkAgain();
}假设您正在测试quest.embark()的错误用例
@Test
public void knightShouldEmbarkOnQuest() {
Quest mockQuest = mock(Quest.class);
Mockito.doThrow(RuntimeException.class).when(mockQuest).embark();
...
}在本例中,您希望确保不调用quest.embarkAgain (或调用0次):
verify(mockQuest, times(0)).embarkAgain(); //or verifyZeroInteractions当然,这是另一个简单的例子。还可以添加许多其他例子:
发布于 2018-09-07 12:47:56
考虑以下代码:
public void saveFooIfFlagTrue(Foo foo, boolean flag) {
if (flag) {
fooRepository.save(foo);
}
}如果您不检查调用fooRepository.save()的次数,那么如何知道此方法是否正在执行您希望它执行的任务?
这也适用于其他的无效方法。如果没有返回到方法,因此没有响应来验证,那么检查调用了哪些其他方法是验证方法是否正确的好方法。
发布于 2018-09-07 12:23:49
问得好。你提出了一个很好的观点,当你只检查结果时,嘲笑可能会过于迂回。然而,在某些情况下,这确实会导致更健壮的测试。
例如,如果一个方法需要调用外部API,那么简单地测试结果有几个问题:
来回答你的分问题:
您不认为embarkOnQuest()调用之后一定会调用that ()吗?
测试也有价值,可以让您重构,而不必担心破坏。这一点现在很明显,是的。6个月后会很明显吗?
https://stackoverflow.com/questions/52222264
复制相似问题