使用方法存根创建 Mockito 模拟的流畅方式(构建器风格)

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

在 Java 中创建 Mockito 模拟的方法之一是

  1. 创建模拟
  2. 对方法进行存根。

比如这样:

// this code is just a imaginary proposal 
private Properties emptyProperties()  {
    Properties myMock = mock(Properties.class); // 1
    when(myMock.isEmpty()).thenReturn(true);    // 2
    when(myMock.size()).thenReturn(0);          // 2
    return myMock;
}

我想以这样流畅的方式创建这个模拟:

private Properties emptyProperties()  {
    return buildMock(Properties.class) // 1
      .when(myMock.isEmpty()).thenReturn(true)    // 2
      .when(myMock.size()).thenReturn(0)          // 2
}

Mockito 本身是否有任何机制允许构建这样的模拟?或者任何其他框架可以促进这种构建方式?

java mockito builder fluent
1个回答
0
投票

我不认为避免一行有什么好处,但如果你必须这样做,这里可能是一种方法。它是 Mockito 模拟对象的薄包装,允许将配置应用于模拟对象,然后返回自身。

public class FluentMock<M> {

    private final M mock;

    private FluentMock(final M mock) {
        this.mock = mock;
    }

    public static <M> FluentMock<M> mock(final Class<M> cls) {
        return new FluentMock<>(Mockito.mock(cls));
    }

    public FluentMock<M> stub(final Consumer<? super M> stubber) {
        stubber.accept(mock);
        return this;
    }

    public M returnMock() {
        return mock;
    }
}

用途:

@Test
void fluent_expression() {
    final DemoClass demoMock = FluentMock.mock(DemoClass.class)
            .stub(mock -> when(mock.getName()).thenReturn("skynet"))
            .stub(mock -> when(mock.getAge()).thenReturn(666))
            .returnMock();

    assertThat(demoMock.getName()).isEqualTo("skynet");
    assertThat(demoMock.getAge()).isEqualTo(666);
}

@Test
void fluent_statement() {
    final DemoClass demoMock = FluentMock.mock(DemoClass.class)
            .stub(mock -> {
                when(mock.getName()).thenReturn("skynet");
                when(mock.getAge()).thenReturn(666);
            })
            .returnMock();

    assertThat(demoMock.getName()).isEqualTo("skynet");
    assertThat(demoMock.getAge()).isEqualTo(666);
}

不确定这是否是您所希望的。

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