【问题标题】:Wanted to but not invoked. Mockito想要但没有被调用。莫基托
【发布时间】:2021-12-03 17:12:03
【问题描述】:

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

没有在我们的测试类中实际调用方法?

我的测试课:

class Test{

Action action=new Action();

@Mock
Provider provider;

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

action.update();

}

如您所见,“provider”只是被模拟了,没有被显式调用。调用它的唯一方法是当我调用 action.update();我收到了错误

需要但未调用:实际上,与此模拟的交互为零。 provider.getNames()

class Action{

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

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


}


 

【问题讨论】:

  • 1.如何将模拟的提供者实例传递给操作?
  • 嗨@Lesiak,我没有将提供者的模拟实例传递给操作。我只是在调用 action.update()。但是,我被要求验证是否正在调用 provider.getNames() 并返回正确的 o/p。供您参考,我还添加了我的 Action 类代码
  • 好吧,那是你的问题。请参阅我的更新答案。

标签: mockito


【解决方案1】:

您的操作顺序错误。如果在调用action.update() 时调用了provider,那么您应该在调用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();
}

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

您需要使用dependency injection 传入您要用于验证交互的提供程序。

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

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
}

【讨论】:

  • 谢谢。我更改了顺序,但仍然看到相同的错误。
  • 当我在 action.update() 之前执行此操作时,我的 UT 运行良好。 “provider.getNames()”,但要求是明确避免调用 getNames()
  • 嗨@dominicoder:谢谢,这也抛出了同样的异常“想要但没有被调用”
  • 顺便说一句,我根据您的建议更改了代码。现在得到错误:参数不同!需要:实际调用有不同的参数:
  • 请用完整的代码示例和错误更新您的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-22
  • 2010-11-18
  • 1970-01-01
相关资源
最近更新 更多