采取供应商的模拟方法 方法不起作用

问题描述 投票:2回答:1

鉴于以下类别:

class Logger {
  public void log(String someInfo,
                  String someOtherInfo,
                  VssNotificationStatus status,
                  Supplier<String> message)
  {}
}

class Asset {
  private String name;
  private String alias;

  Asset(String name, String alias) {
    this.name = name;
    this.alias = alias;
  }

  public String getName() {
    return name;
  }

  public String getAlias() {
    return alias;
  }
}

class ClassUnderTest {
  private Logger logger;

  ClassUnderTest(Logger logger) {
    this.logger = logger;
  }

  public void methodUnderTest(Asset asset) {
    logger.log(asset.getName(), asset.getAlias(), VssNotificationStatus.ASSET_PREPARED, () -> String.format("%s is running", "methodUnderTest"));
  }
}

以下测试代码:

@RunWith(MockitoJUnitRunner.class)
public class TestA {
  private ClassUnderTest clazz;
  @Mock
  private Logger logger;

  @Before
  public void setup() {
    clazz = new ClassUnderTest(logger);
  }

  @Test
  public void test() {
    // given
    String info1 = "info1";
    String info2 = "info2";
    Asset asset = mock(Asset.class);
    given(asset.getName()).willReturn(info1);
    given(asset.getAlias()).willReturn(info2);

    // when
    clazz.methodUnderTest(asset);

    // then
    verify(logger).log(eq(asset.getName()), eq(asset.getAlias()), eq(VssNotificationStatus.ASSET_PREPARED), any());
  }
}

verify线上失败了

org.mockito.exceptions.misusing.InvalidUseOfMatchersException: 
Invalid use of argument matchers!
0 matchers expected, 1 recorded

我试图使用isA(Supplier.class),在Supplier.class方法中指定any,但仍然是同样的错误。感觉Mockito并没有正确地嘲弄这种方法。

那些失败的测试在将最后一个参数从简单的String参数重构为Supplier<String>之前正确传递。

我正在使用mockito-core 2.13.0

java unit-testing functional-programming mockito
1个回答
0
投票

当你传递一个模拟方法而不是使用你直接模拟这个方法时使用的值时,看起来Matchers不喜欢它。以下verify工作得非常好。

verify(logger).log(eq(info1), eq(info2), eq(VssNotificationStatus.ASSET_PREPARED), any());

因此,匹配器应该使用真实值而不是从模拟对象中获取它们。

© www.soinside.com 2019 - 2024. All rights reserved.