spring - 如何使用 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 类。
解决方案
我已经重写了你的测试。您不应该模拟您的 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");
}
推荐阅读
- javascript - 键入时的密码验证不适用于 Vanilla JavaScript 中的特殊字符
- angularjs - 加载资源失败:服务器响应状态为 405(不允许方法)
- arangodb - 用于验证节点路径的 AQL
- c# - 如何在 .net 核心中使用 JwtSecurityTokenHandler 和 Compression DEFLATE 生成/验证 JWT 令牌
- batch-file - 创建批处理文件以遍历文本文件并删除所有引号
- ruby-on-rails - 在heroku中部署我的代码时出现SQLite检测错误
- django - Django 消息 - 在添加之前检查消息是否已经存在
- java - 构建 APK(s):构建 APK 时出错。您可以在“消息”视图中找到错误
- python - 基于Dataframe中逗号分隔列中的文本分组
- python - Python:运行第二个单元测试后的 Paramiko 单元测试异常