Java 在Mockito中匹配vararg以在重载方法中进行单元测试
我无法在Mockito中的重载构造函数上模拟varargs。这是我想测试的方法Java 在Mockito中匹配vararg以在重载方法中进行单元测试,java,unit-testing,mockito,spring-rest,Java,Unit Testing,Mockito,Spring Rest,我无法在Mockito中的重载构造函数上模拟varargs。这是我想测试的方法 @Override public List<User> fetchDataFromExternalService() { return Arrays.asList(this.restTemplate.getForObject(URL, User[].class)); } 我试图模拟第一个返回用户数组的函数,但不管我尝试什么,它总是返回null。我不知道我做错了什么 我的模拟功能 User
@Override
public List<User> fetchDataFromExternalService() {
return Arrays.asList(this.restTemplate.getForObject(URL, User[].class));
}
我试图模拟第一个返回用户数组的函数,但不管我尝试什么,它总是返回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;
}
}
类MyVarargMatcher实现ArgumentMatcher,VarargMatcher{
@凌驾
公共布尔匹配(对象[]参数){
返回true;
}
}
我在这篇文章中尝试过使用这种方法,但这种方法已被弃用
Maven配置
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>2.13.0</version>
<scope>test</scope>
</dependency>
org.mockito
莫基托磁芯
2.13.0
测试
如何解决此问题?您说得对,但在相同的文档中,您可以发现应该使用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 "";
}
}
import org.junit.Test;
导入静态org.junit.Assert.assertEquals;
导入静态org.mockito.ArgumentMatchers.any;
导入静态org.mockito.mockito.*;
公开课博士考试{
@试验
public void testMockito(){
DocTest doc=mock(DocTest.class);
当(doc.getDocs(eq(String.class)、any(String.class))。然后返回(“成功”);
assertEquals(“success”,doc.getDocs(String.class));
assertEquals(null,doc.getDocs(Integer.class));
assertEquals(“成功”,doc.getDocs(String.class,“失败”,“失败”);
assertEquals(null,doc.getDocs(String.class,新整数(1));
}
公共字符串getDocs(类clazz、对象…对象){
返回“”;
}
}
以下内容对我很有用:
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));
}
}
AdditionalMatchers在方法API中不显示“any”。您是对的,复制过去的错误。正确的名称是
org.mockito.ArgumentMatchers.any()
。您能告诉我们您到底是如何尝试的吗?restTemplate应该是模拟对象。我将用工作示例更新答案。如果不将varags传递给该方法会发生什么情况。我在方法调用结束时取出了数字,它仍然会传递
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));
}
}