![](/img/trans.png)
[英]Mockito and matching varargs properly with overloaded methods with Spring Redis
[英]Matching varargs in Mockito for unit testing in an overloaded method
我無法在 Mockito 中的重載構造函數上模擬可變參數。 這是我要測試的方法
@Override
public List<User> fetchDataFromExternalService() {
return Arrays.asList(this.restTemplate.getForObject(URL, User[].class));
}
User
是一個具有屬性、getter 和 setter 的 POJO 類。 RestTemplate 實例是Spring 的 Rest 模板。 .
這個函數是一個重載函數,有以下方法
1) public <T> T getForObject(java.lang.String url,
java.lang.Class<T> responseType,
java.lang.Object... uriVariables)
throws RestClientException
2) public <T> T getForObject(java.lang.String url,
java.lang.Class<T> responseType,
java.util.Map<java.lang.String,?> uriVariables)
throws RestClientException
我試圖模擬第一個函數來返回一個用戶數組,但不管我嘗試什么,它總是返回null
。 我不知道我做錯了什么。
我的嘲諷功能。
User user = new User();
Mockito.when(this.restTemplate.getForObject(
Mockito.anyString(), Mockito.eq(User[].class), (Object[]) Mockito.any())).thenReturn(new User[] {user});
我嘗試使用自定義參數匹配器如下,
Mockito.when(this.restTemplate.getForObject(
Mockito.anyString(), Mockito.eq(User[].class),
Mockito.argThat(new MyVarargMatcher()))).thenReturn(new User[] {user});
但它仍然為我返回null
。
class MyVarargMatcher implements ArgumentMatcher<Object[]>, VarargMatcher {
@Override
public boolean matches(Object[] argument) {
return true;
}
}
我嘗試使用這篇文章中的方法,但該方法已被棄用。
https://static.javadoc.io/org.mockito/mockito-core/2.2.7/org/mockito/ArgumentMatchers.html#any()
Maven配置
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>2.13.0</version>
<scope>test</scope>
</dependency>
我該如何解決這個問題?
以下對我有用:
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.runners.MockitoJUnitRunner;
import org.springframework.web.client.RestTemplate;
@RunWith(MockitoJUnitRunner.class)
public class DemoApplicationTests {
@Mock
private RestTemplate restTemplate;
@Test
public void testy() {
Mockito.when(restTemplate.getForObject(Mockito.anyString(), Mockito.any(), (Object) Mockito.any())).thenReturn("this works");
Assert.assertEquals("this works", restTemplate.getForObject("hi", String.class, 42, 45));
}
}
您對deprecation是正確的,但在同一文檔中,您會發現您應該使用 ArgumentMatchers.any() 以及有關它的更多詳細信息。 所以正確的例子應該是:
Mockito.when(this.restTemplate.getForObject(Mockito.anyString(),
Mockito.eq(User[].class), ArgumentMatchers.any())).thenReturn(new User[] {user});
如果您的 varArgs 與 Object.class 不同,您可以指定它來縮小匹配范圍ArgumentMatchers.any(String.class)
。
工作示例:
import org.junit.Test;
import static org.junit.Assert.assertEquals;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.*;
public class DocTest {
@Test
public void testMockito() {
DocTest doc = mock(DocTest.class);
when(doc.getDocs(eq(String.class), any(String.class))).thenReturn("success");
assertEquals("success", doc.getDocs(String.class));
assertEquals(null, doc.getDocs(Integer.class));
assertEquals("success", doc.getDocs(String.class, "failed", "failed"));
assertEquals(null, doc.getDocs(String.class, new Integer(1)));
}
public <T> String getDocs(Class<T> clazz, Object... objects){
return "";
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.