【问题标题】:Evaluate parameter passed to mocked method called from another class评估传递给从另一个类调用的模拟方法的参数
【发布时间】:2019-08-27 17:53:42
【问题描述】:

我正在测试一个使用我模拟过的另一个类的类。外部类的方法之一修改了传递给模拟类方法的参数,我需要检查它是否被正确修改。

代码如下所示:

public class Foo
{
  public boolean performTask(String name, Integer version)
  {
    ...
  }
}

public class Bar
{
  private Foo foo;

  public Bar(Foo foo)
  {
    this.foo = foo;
  }

  public void doSomething(String name, Integer version)  
  {  
    boolean good = foo.performTask(name, ((version.startsWith("A")) ? null : version));
    ...
  }
}

我需要检查如果我传递了一个以A 开头的name 参数,那么传递给performTask() 的第二个参数是否为空。

编辑:

根据要求,这是单元测试的开始:

public class BarTest
{
  @Mock
  private Foo mockFoo;

  @Before
  public void setup() throws Exception
  {
    MockitoAnnotations.initMocks(this);
  }

  @Test
  public void test() throws Exception
  {
    Bar bar = new Bar(mockFoo);

    bar.doSomething("ABC", new Integer(1));
  }
}

【问题讨论】:

  • 你的测试结果如何?我假设模拟Foo 并将模拟提供给Bar 就可以了。之后您可以使用Mockito.verify 来确保调用了正确的方法。
  • 我看到的所有使用 verify 的示例都涉及直接调用模拟类。在这种情况下我该如何使用它?

标签: java mockito


【解决方案1】:

我见过的所有使用 verify 的示例都涉及直接调用模拟类。在这种情况下如何使用它?

就是这样。您所需要的只是访问您拥有的模拟。

Mockito.verify(mockFoo, Mockito.times(1)).performTask("ABC", null);

如果方法应该对return 很重要(默认为false), 您需要使用以下方式定义行为:

Mockito.when(mockFoo.performTask("ABC", null)).thenReturn(true);

例子:

@Test
public void test() throws Exception {
    Mockito.when(mockFoo.performTask("ABC", null)).thenReturn(true);

    Bar bar = new Bar(mockFoo);
    bar.doSomething("ABC", new Integer(1));

    Mockito.verify(mockFoo, Mockito.times(1)).performTask("ABC", null);
}

【讨论】:

  • 谢谢!这行得通。我现在意识到我的错误不包括将模拟方法的行为设置为成功返回的行。
  • 嘿,即使您将模拟方法设置为返回异常,这也会起作用吗?即 doThrow(new Exception()).when(mockFoo).performTask(anyString(), any());
  • 是的,这应该是一个可行的用例。在调用模拟之后(并且因为)引发异常,因此将计算交互。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-29
  • 2022-10-05
  • 2010-12-21
  • 1970-01-01
  • 1970-01-01
  • 2016-12-21
  • 1970-01-01
相关资源
最近更新 更多