Java 在Mockito中匹配vararg以在重载方法中进行单元测试

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

我无法在Mockito中的重载构造函数上模拟varargs。这是我想测试的方法

@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));
    }

}