簡體   English   中英

如何使用 mockito 在 spring 啟動時測試資源加載器

[英]How can I test resource loader in spring boot using mockito

我正在開發一個 spring 啟動 2.1.3 應用程序,該應用程序具有使用 ResourceLoader class 從資源目錄讀取文本文件的服務:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;
import org.springframework.stereotype.Service;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.List;
import java.util.stream.Collectors;

@Service
public class TestService {

  @Autowired
  ResourceLoader resourceLoader;

  public String testMethod(String test) {
    List<String> list = null;

    Resource resource = resourceLoader.getResource("classpath:test.txt");
    try (BufferedReader buffer = new BufferedReader(new InputStreamReader(resource.getInputStream()))) {
      list = buffer.lines().collect(Collectors.toList());
    } catch (Exception e) {
      System.out.println("error : " + e);
    }

    if (list.contains(test)) {
      return "in file";
    }

    return "not in file";
  }
}

我正在使用 mockito 為該服務編寫單元測試:

@RunWith(MockitoJUnitRunner.class)
@ContextConfiguration()
public class AServiceTest {
  @InjectMocks
  private TestService cut;

  @Test
  public void testSuccessfulResponse() {
    String actualResponse = cut.method("teststring");
    String expectedResponse = getSuccessfulResponse();

    assertThat(actualResponse, is(expectedResponse));
  }

但是我跑測試的時候resourceLoader是null?

在此示例中,我如何測試 resourceLoader class。

我已經重新編寫了您的測試。 您不應嘲笑您的TestService,因為您實際上正在對其進行測試。 這是我所做的。

  • mockFile:是代表您文件的多行字符串
  • resourceLoader:模擬並將其設置為返回Resource
  • mockResource:模擬的Resource並將其設置為返回模擬文件的InputStream。
    @Test
    public void testSuccessfulResponse() throws IOException {
        String mockFile = "This is my file line 1\nline2\nline3";
        InputStream is = new ByteArrayInputStream(mockFile.getBytes());
        cut = new TestService();
        ResourceLoader resourceLoader = Mockito.mock(ResourceLoader.class);
        cut.resourceLoader = resourceLoader;

        Resource mockResource = Mockito.mock(Resource.class);
        Mockito.when(mockResource.getInputStream()).thenReturn(is);

        Mockito.when(resourceLoader.getResource(Mockito.anyString())).thenReturn(mockResource);

        String actualResult1 = cut.testMethod("line3");
        Assert.assertEquals(actualResult1, "in file");

        String actualResult2 = cut.testMethod("line4");
        Assert.assertEquals(actualResult2, "not in file");
    }

對於像這樣的情況,您可以使用@Mock@InjectMocks annoatations 簡單地模擬和注入 resourceLoader 並返回同樣被模擬的預期資源。

關鍵部分是:

@Mock
ResourceLoader resourceLoader;

@InjectMocks
private TestService cut;

// ... inside the test class
when(resourceLoader.getResource(anyString())).thenReturn(mockResource);

完整的代碼如下所示:

import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

@RunWith(MockitoJUnitRunner.class)
public class TestServiceTest {

  @Mock
  ResourceLoader resourceLoader;

  @InjectMocks
  private TestService cut;

  @Test
  public void testSuccessfulResponse() throws IOException {

    // Given
    String testString = "teststring";
    InputStream is = new ByteArrayInputStream(testString.getBytes());;
    Resource mockResource = mock(Resource.class);
    when(mockResource.getInputStream()).thenReturn(is);
    when(resourceLoader.getResource(anyString())).thenReturn(mockResource);

    // When
    String actualResponse = cut.testMethod(testString);
    
    // Then
    String expectedResponse = "in file";
    assertEquals(actualResponse, expectedResponse);
  } 
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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