gpt4 book ai didi

java - Mockito:验证模拟(带有 "RETURNS_DEEP_STUBS")返回比预期更多的调用

转载 作者:太空狗 更新时间:2023-10-29 22:46:07 35 4
gpt4 key购买 nike

查看下面的代码,我只希望对 getSand() 的调用发生一次,但测试失败了四次。这些电话在哪里发生?我想编写一个测试以确保只对 getSand() 进行一次调用。

来源

import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Answers;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;

import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

@RunWith(MockitoJUnitRunner.class)
public class DeepSandTest {

@Mock(answer = Answers.RETURNS_DEEP_STUBS)
SandBox mockSandBox;

@Test
public void should(){
when(mockSandBox.getSand().doA()).thenReturn(1);
when(mockSandBox.getSand().doB()).thenReturn(1);
when(mockSandBox.getSand().doC()).thenReturn(1);

DeepSand deepSand = new DeepSand(mockSandBox);
deepSand.getTipple();

verify(mockSandBox, times(1)).getSand();
}

public class DeepSand{

private SandBox sandBox;

public DeepSand(SandBox sandBox) {
this.sandBox = sandBox;
}

public void getTipple(){
Sand sand = sandBox.getSand();
sand.doA();
sand.doB();
sand.doC();
}
}

public interface SandBox{
public Sand getSand();
}

public interface Sand{
public Integer doA();
public Integer doB();
public Integer doC();
}
}

输出

org.mockito.exceptions.verification.TooManyActualInvocations: 
mockSandBox.getSand();
Wanted 1 time:
-> at DeepSandTest.should(DeepSandTest.java:26)
But was 4 times. Undesired invocation:
-> at DeepSandTest.should(DeepSandTest.java:20)

详细信息Java 1.6、JUnit 4.11、Mockito 1.9.5

经验教训

如果您将深度 stub 视为一棵模拟对象树,那么您应该只验证叶子(“链中的最后一个模拟”),因为节点包含在设置叶子行为所需的调用链中。换句话说,节点叶子的设置过程中被调用。

最佳答案

因为 deeps stub 是 not supported in the verification API,所以它将您的设置计为调用,并在第二次通话时提示:

when(mockSandBox.getSand().doB()).thenReturn(1);

我会跳过使用 RETURNS_DEEP_STUBS 而只使用另一个模拟:

...
@Mock
SandBox mockSandBox;

@Mock
Sand sand;

@Test
public void should(){
when(mockSandBox.getSand()).thenReturn(sand);
when(sand.doA()).thenReturn(1);
when(sand.doB()).thenReturn(1);
when(sand.doC()).thenReturn(1);
...

关于java - Mockito:验证模拟(带有 "RETURNS_DEEP_STUBS")返回比预期更多的调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19963622/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com