当前位置: 首页 > 知识库问答 >
问题:

想要但没有被调用。莫奇托

乐正峰
2023-03-14

我有个问题。也许这是非常基本的。我们可以这样做吗

而不实际调用我们测试类中的方法?

我的测试类:

class Test{

Action action=new Action();

@Mock
Provider provider;

when(provider.getNames()).thenReturn(Arrays.asList("names"));
verify(provider,atLeastOnce()).getNames();

action.update();

}

如您所见,“提供者”只被嘲笑而没有被显式调用。调用它的唯一方法是当我调用action.update()时;我得到了错误

通缉但未调用:实际上,与此模拟没有任何交互。provider.get名称()

class Action{

public void update(){
Provider provider = new Provider();

List<String> l=provider.getNames();
}


}


 

共有1个答案

宰父桐
2023-03-14

您的操作顺序错误。如果在调用action.update()时调用了提供程序,那么您应该在调用action.update()后验证:

when(provider.getNames()).thenReturn(Arrays.asList("names"));

action.update(); // Do action first

verify(provider,atLeastOnce()).getNames(); // Then verify outcome of "action"

更新

您的代码当前不可测试:

public void update(){
    Provider provider = new Provider();

    List<String> l=provider.getNames();
}

您的代码表示“当调用update时,创建一个新的提供程序并在该提供程序上调用getNames”。你的测试说“断言这个与动作交互的随机提供者被称为”,这当然永远不会通过。

您需要使用依赖注入来传递要用于验证交互的提供程序。

要么将提供者传递给函数:

public void update(Provider provider){
    List<String> l=provider.getNames();
}

所以你可以这样测试:

action.update(provider)

verify(provider).getNames()

或通过构造函数传递提供者:

class Action {
    private final Provider mProvider;

    // Default constructor can be used in main app as usual
    public Action() {
        this(new Provider())
    }

    // Argument constructor can receive a provider that can be mocked
    public Action(Provider provider) {
         mProvider = provider;
    }

    public void update(){
        // Provider provider = new Provider(); // Don't do this

        List<String> l = mProvider.getNames(); // Use constructor provided object
    }

然后您可以测试:

@Test
public void test() {
    Action action = new Action(provider); // Inject mock
    action.update();
    verify(provider).getNames(); // Now our mock will get called
}
 类似资料: