admin管理员组文章数量:1389580
I'm writing a unit test in a Spring Boot application using Mockito and JUnit 5, and I'm trying to verify a method call where one of the parameters is a Map<String, String>.
Here's the method signature:
public void someMethod(SomeClass obj, String parameter1, Map<String, String> properties) { ... }
I need to verify that this method was called with a Map containing certain keys (property2 and property3) but with any string value.
Here's my test code:
@Test
void testMethodVerification() {
Map<String, String> properties = Map.of(
"property1", "TEST_VALUE",
"property2", anyString(), // This causes an error
"property3", anyString() // This causes an error
);
verify(mockedService, times(1)).someMethod(
any(SomeClass.class),
eq("some_attribute"),
eq(properties) // Issue occurs here
);
}
However, I'm getting this error:
.mockito.exceptions.misusing.UnfinishedVerificationException:
Missing method call for verify(mock) here:
-> at com.mycompany.myproject.MyTestClass.testMethodVerification(MyTestClass.java:XX)
Question: How can I verify that someMethod was called with a Map where "property2" and "property3" can be any string?
Would appreciate any guidance!
I tried using anyString() inside Map.of() to allow flexibility in verifying property2 and property3. However, I encountered an UnfinishedVerificationException because anyString() is an argument matcher and cannot be used directly inside Map.of().
I expected Mockito to verify that the method was called with a Map containing "property1" as a fixed value and "property2" and "property3" as any string values. However, the test failed due to incorrect matcher usage.
Now, I’m looking for the correct way to verify a method call where certain Map values can be any string, while other keys must match specific values.
I'm writing a unit test in a Spring Boot application using Mockito and JUnit 5, and I'm trying to verify a method call where one of the parameters is a Map<String, String>.
Here's the method signature:
public void someMethod(SomeClass obj, String parameter1, Map<String, String> properties) { ... }
I need to verify that this method was called with a Map containing certain keys (property2 and property3) but with any string value.
Here's my test code:
@Test
void testMethodVerification() {
Map<String, String> properties = Map.of(
"property1", "TEST_VALUE",
"property2", anyString(), // This causes an error
"property3", anyString() // This causes an error
);
verify(mockedService, times(1)).someMethod(
any(SomeClass.class),
eq("some_attribute"),
eq(properties) // Issue occurs here
);
}
However, I'm getting this error:
.mockito.exceptions.misusing.UnfinishedVerificationException:
Missing method call for verify(mock) here:
-> at com.mycompany.myproject.MyTestClass.testMethodVerification(MyTestClass.java:XX)
Question: How can I verify that someMethod was called with a Map where "property2" and "property3" can be any string?
Would appreciate any guidance!
I tried using anyString() inside Map.of() to allow flexibility in verifying property2 and property3. However, I encountered an UnfinishedVerificationException because anyString() is an argument matcher and cannot be used directly inside Map.of().
I expected Mockito to verify that the method was called with a Map containing "property1" as a fixed value and "property2" and "property3" as any string values. However, the test failed due to incorrect matcher usage.
Now, I’m looking for the correct way to verify a method call where certain Map values can be any string, while other keys must match specific values.
Share Improve this question asked Mar 14 at 22:07 samsam 11 silver badge 1- 1 you can't, anyString is used in mocks, not concrete classes like a HashMap, you will have to mock the entire hashmap. Cant give any more information since you have provided too little information. – Toerktumlare Commented Mar 14 at 22:57
1 Answer
Reset to default 4anyString()
only works if you use it inside a when
or verify
call. If you use it outside, it will simply return the empty string ""
(and corrupt Mockito's internal matcher stack).
If you need to perform custom matching, argThat
or a custom ArgumentMatcher
implementation work:
verify(mockedService).someMethod(
any(SomeClass.class),
eq("some_attribute"),
argThat(arg -> Objects.equals(arg.get("property1"), "TEST_VALUE")
&& arg.containsKey("property2")
&& arg.containsKey("property3")));
A custom implementation allows you to override its toString
method, which is very useful if your verification failed and you want to get readable failure messages.
class MapMatcher implements ArgumentMatcher<Map<String, String>> {
@Override
public boolean matches(final Map<String, String> map) {
return Objects.equals(map.get("property1"), "TEST_VALUE")
&& map.containsKey("property2")
&& map.containsKey("property3")
}
@Override
public String toString() {
return "{property1=>TEST_VALUE,property2=>*,property3=>*}";
}
}
Usage of the custom matcher:
verify(mockedService).someMethod(
any(SomeClass.class),
eq("some_attribute"),
argThat(new MapMatcher()));
本文标签: javaHow to use anyString() inside a Map for Mockito verificationStack Overflow
版权声明:本文标题:java - How to use anyString() inside a Map for Mockito verification? - Stack Overflow 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/web/1744630419a2616503.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论