无法使用 Mockito 模拟带参数的静态方法
Unable to mock static methods with parameters using Mockito
我正在尝试使用 Mockito 的一些新功能,特别是静态方法的模拟。
当我模拟的方法没有参数时,我能够让它工作,但由于某种原因,如果该方法有任何参数,它就不会工作。
如下例所示,测试 assertEquals( "bar", Foo.foo() )
有效,但测试 assertEquals(2, map.size() )
失败,因为没有为模拟的 class.
定义任何行为
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() );
}
}
}
Class被嘲笑
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;
}
}
看起来这只是一个语法问题,我对方法引用不是很熟悉,但我不知道正确的语法是什么。
这是正确的语法
fooMock.when( () -> Foo.genMap(any()) ).thenCallRealMethod();
anyString()
可以用,但是应该没有区别,因为没有歧义。
我正在尝试使用 Mockito 的一些新功能,特别是静态方法的模拟。
当我模拟的方法没有参数时,我能够让它工作,但由于某种原因,如果该方法有任何参数,它就不会工作。
如下例所示,测试 assertEquals( "bar", Foo.foo() )
有效,但测试 assertEquals(2, map.size() )
失败,因为没有为模拟的 class.
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() );
}
}
}
Class被嘲笑
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;
}
}
看起来这只是一个语法问题,我对方法引用不是很熟悉,但我不知道正确的语法是什么。
这是正确的语法
fooMock.when( () -> Foo.genMap(any()) ).thenCallRealMethod();
anyString()
可以用,但是应该没有区别,因为没有歧义。