在重载方法中匹配 Mockito 中的可变参数以进行单元测试
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
是一个 POJO class,它具有属性、getter 和 setter。 RestTemplate 实例是 Spring's Rest Template..
该函数为重载函数,有以下方法
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
我正在尝试将第一个函数模拟到 return 一组用户,但无论我尝试什么,它总是 returns 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});
但它仍然 return 为我 null
。
class MyVarargMatcher implements ArgumentMatcher<Object[]>, VarargMatcher {
@Override
public boolean matches(Object[] argument) {
return true;
}
}
我尝试使用此 post 中的方法,但该方法已被弃用。
How to properly match varargs in Mockito
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>
我该如何解决这个问题?
你说得对 deprecation, but in the same documentation you could find that you should use ArgumentMatchers.any() and more details about it。所以正确的例子应该是:
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 "";
}
}
以下对我有用:
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));
}
}
我无法在 Mockito 的重载构造函数上模拟可变参数。这是我要测试的方法
@Override
public List<User> fetchDataFromExternalService() {
return Arrays.asList(this.restTemplate.getForObject(URL, User[].class));
}
User
是一个 POJO class,它具有属性、getter 和 setter。 RestTemplate 实例是 Spring's Rest Template..
该函数为重载函数,有以下方法
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
我正在尝试将第一个函数模拟到 return 一组用户,但无论我尝试什么,它总是 returns 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});
但它仍然 return 为我 null
。
class MyVarargMatcher implements ArgumentMatcher<Object[]>, VarargMatcher {
@Override
public boolean matches(Object[] argument) {
return true;
}
}
我尝试使用此 post 中的方法,但该方法已被弃用。
How to properly match varargs in Mockito
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>
我该如何解决这个问题?
你说得对 deprecation, but in the same documentation you could find that you should use ArgumentMatchers.any() and more details about it。所以正确的例子应该是:
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 "";
}
}
以下对我有用:
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));
}
}