首页 > 解决方案 > 如何使用 mockito 在 Spring Boot 中测试资源加载器

问题描述

我正在开发一个 spring boot 2.1.3 应用程序,它有一个使用 ResourceLoader 类从资源目录中读取文本文件的服务:

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 类。

标签: springunit-testingspring-bootmockito

解决方案


我已经重写了你的测试。您不应该模拟您的 TestService,因为您实际上是在测试它。这是我所做的。

  • mockFile:是一个多行字符串,代表您的文件
  • resourceLoader:模拟并将其设置为返回资源
  • mockResource:模拟 Resource 并将其设置为返回 mockFile 的 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");
    }

推荐阅读