【问题标题】:Mock framework for easy creation of inline mocks用于轻松创建内联模拟的模拟框架
【发布时间】:2021-09-09 21:13:42
【问题描述】:

是否有任何流行的 java 模拟库支持部分模拟的内联创建?

类似:

 Foo fooMock = make(mock(Foo.class).returning("val1").from().method1());
    // or even
 Foo fooMock = PartialMock.of(Foo.class, new Mock<Foo>() {
         @Override
         String method1() { return "value"; }
 });

Foo 的样子:

 interface Foo() {
     String method1();
     String method2();
    ....
 }

我在搜索中能找到的最接近的是hadoop's mockmakera StubBuilder class in the wild.

需要明确的是,我知道 mockito 创建模拟并随后使用 Foo fooMock = mock(Foo.class); 后跟 when(mock.method1()).thenReturn("value") 定义行为的方法。我想知道在模拟创建期间是否有办法在单个语句中执行此操作。

【问题讨论】:

    标签: java mocking mockito powermock easymock


    【解决方案1】:

    您可以使用 Mockito 来模拟某些方法,但不能模拟其他方法。

    Stock stock = mock(Stock.class);
    when(stock.getPrice()).thenReturn(100.00);    // Mock implementation
    when(stock.getQuantity()).thenReturn(200);    // Mock implementation
    when(stock.getValue()).thenCallRealMethod();  // Real implementation
    

    【讨论】:

    • 我没有让这个更清楚,我一直在寻找一种速记机制来作为模拟实例化的一部分,而不是之后。
    【解决方案2】:

    你要求的是不可能的。让我们看看你的代码行:

    PartialMock.of(Foo.class) // 1
               .withMethod()  // 2
               .method1()     // 3
               .thenReturn("value");
    
    1. 如果of 返回Foo 类,withMethod 将不存在。所以它必须是FooBuilder
    2. 如果withMethod 返回一个Foo 类,我们就有method1。但是method 不会返回带有thenReturn 的东西。所以我们需要一个具有相同方法 Foo 但返回类型不同的类。 FooMock 可能。但是这个类在静态编译时不存在。我们需要让它看起来像龙目岛一样。使用编译器工具
    3. method1 需要返回,所以现在 FooResult 上面有 thenReturn

    如您所见,这是一项非常复杂的工作,但现在在可读性和易用性方面取得了很大的进步。

    另外,我们是说它是部分模拟吗?在我看来,这只是一个普通的模拟。

    【讨论】:

    • 语法不需要精确,我问这个是因为我前段时间遇到过这样的语法,但不记得是哪个框架提供了它。一个更正确的例子是:PartialMock.of(Foo.class).suchThat(foo -&gt; foo.method1()).returns("value"). 我刚刚发现的另一个真实世界的例子是 Hadoop 的 MockitoMaker:tabnine.com/code/java/classes/…
    • 有趣。但是,我从示例中看到的是,您可以模拟一件事。然后他们使用when。也就是说,有可能并且这种流畅的方式可以防止总是添加静态导入。如果你愿意 PR EasyMock,那就去吧 ;-)
    • 我问这个问题的原因是我记得在 EasyMock、Powermock 或其他一些库中看到过这个 api(或类似的),但我不记得是哪个 :(
    • 我不知道 EasyMock、Mockito、JMockit 或 Spock 会这样做。现在确定还剩下什么
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多