簡體   English   中英

在 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是一個具有屬性、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;
    }
  }

我嘗試使用這篇文章中的方法,但該方法已被棄用。

如何在 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>

我該如何解決這個問題?

以下對我有用:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM