【问题标题】:Unable to mock static methods with parameters using Mockito无法使用 Mockito 模拟带参数的静态方法
【发布时间】:2020-11-12 18:14:34
【问题描述】:

我正在尝试使用 Mockito 的一些新功能,特别是模拟静态方法。

当我正在模拟的方法没有参数时,我能够让它工作,但由于某种原因,如果该方法有任何参数,它就不会工作。

如下例所示,测试assertEquals( "bar", Foo.foo() ) 有效,但测试assertEquals(2, map.size() ) 失败,因为没有为模拟类定义任何行为。

fooMock.when(Foo::genMap).thenCallRealMethod() 给出以下编译时错误:

  • Foo 类型未定义适用于此处的 genMap()
  • MockedStatic 类型中的 when(MockedStatic.Verification) 方法不适用于参数 (Foo:: genMap)

fooMock.when( (String s)->Foo.genMap(s) ).thenCallRealMethod() 给出这些编译时错误:

  • MockedStatic 类型中的 when(MockedStatic.Verification) 方法不适用于参数 ((String s) -> {})
  • Lambda 表达式的签名与函数式接口方​​法 apply() 的签名不匹配

单元测试:

@RunWith(MockitoJUnitRunner.class)
public class FooTest {

    @Test
    public void fooTest(){  
        try( MockedStatic<Foo> fooMock = Mockito.mockStatic(Foo.class) ){
            fooMock.when(Foo::foo).thenReturn("bar");
            assertEquals( "bar", Foo.foo() );
            //fooMock.when(Foo::genMap).thenCallRealMethod();
            //fooMock.when( (String s)->Foo.genMap(s) ).thenCallRealMethod();
            Map<String, String> map = Foo.genMap("1=one 2=two");
            assertEquals(2, map.size() );
        }
    }

}

要模拟的类

public class Foo {

    public static String foo() {
        return "foo";
    }

    public static Map<String, String> genMap(String str){
        Map<String, String> map = new HashMap<String, String>();
        for(String subStr : str.split(" ")) {
            String[] parts = subStr.split("=");
            map.put(parts[0], parts[1]);
        }
        return map;
    }
}

看起来这只是一个语法问题,我对方法引用不是很熟悉,但我不知道正确的语法是什么。

【问题讨论】:

  • 这个测试没有任何意义。此外,您应该单独测试该类的每个方法。
  • 这只是一个简单的例子。我实际上是在尝试模拟对我正在测试的实用程序类的依赖。

标签: java unit-testing lambda mockito static-methods


【解决方案1】:

这是正确的语法

fooMock.when( () -> Foo.genMap(any()) ).thenCallRealMethod();

anyString()可以使用,但应该没有什么区别,因为它没有歧义。

【讨论】:

  • 谢谢!一旦我创建了一个 anyString 方法,它就可以工作。您能否提供任何链接,以便我更好地理解为什么这是正确的语法?
  • @RichardFeynman 您不需要创建anyString 方法,即argument matcher provided by mockito。您可以搜索java8方法参考主题,这里可能会很长。
猜你喜欢
  • 2022-01-11
  • 1970-01-01
  • 2014-08-30
  • 2014-02-02
相关资源
最近更新 更多