java-在Spring Boot中使用模拟对单元实现进行接口测试
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java-在Spring Boot中使用模拟对单元实现进行接口测试,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2841字,纯文字阅读大概需要5分钟。
内容图文
我正在尝试为Spring Boot中的服务编写一个简单的单元测试.
该服务在存储库上调用方法,该方法返回User的实例.
我正在尝试模拟存储库,因为我只想测试服务.
因此,存储库的代码:
public interface UserRepository extends MongoRepository<User, String> {
User findByEmail(String email);
}
服务界面:
public interface UserService {
@Async
CompletableFuture<User> findByEmail(String email) throws InterruptedException;
}
服务实施:
@Service
public class UserServiceImpl implements UserService {
private UserRepository userRepository;
// dependency injection
// don't need Autowire here
// https://docs.spring.io/spring-boot/docs/current/reference/html/using-boot-spring-beans-and-dependency-injection.html
public UserServiceImpl(UserRepository userRepository) {
this.userRepository = userRepository;
}
@Async
public CompletableFuture<User> findByEmail(String email) throws InterruptedException {
User user = userRepository.findByEmail(email);
return CompletableFuture.completedFuture(user);
}
}
单元测试:
@RunWith(SpringRunner.class)
@SpringBootTest
public class UserServiceTest {
@InjectMocks
UserService userService;
@Mock
UserRepository mockUserRepository;
@Before
public void setUp() {
MockitoAnnotations.initMock(this);
}
@Test
public void mustReturnUser() throws InterruptedException {
String emailTest = "foo@bar.com";
User fakeUser = new User();
fakeUser.setEmail(emailTest);
when(mockUserRepository.findByEmail(emailTest)).thenReturn(fakeUser);
User user = userService.findByEmail(emailTest).join();
assertThat(user).isEqualTo(fakeUser);
verify(mockUserRepository).findByEmail(emailTest);
}
}
当我运行此测试时,我得到了MockitoException:
org.mockito.exceptions.base.MockitoException:
Cannot instantiate @InjectMocks field named 'userService'.
...
Caused by: org.mockito.exceptions.base.MockitoException: the type 'UserService' is an interface.
我没有使用接口,而是尝试使用实际的实现.像这样更改测试:
@InjectMocks
UserServiceImpl userService;
现在,测试成功通过了,但这似乎不正确(至少对我而言).
我喜欢测试Spring Boot使用的UserService(假设在我的系统的新版本中,我实现了一个新的UserServicePostgreSQLImpl-现在我正在使用MongoDB).
(编辑:请参阅问题的底部编辑)
我将单元测试更改如下:
@Autowired
@InjectMocks
UserService userService;
但是现在我测试失败了:
Expected :model.User@383caf89
Actual :null
由于某些原因,当我使用@Autowired时,UserRepository模拟无法正常工作.
如果我将emailTest更改为在数据库中使用真实的电子邮件,
测试通过.
当我使用@Autowired时,
测试使用的是真实的UserRepository,而不是模拟版本的UserRepository.
有什么帮助吗?
编辑:查看来自@msfoster和@dunni的答案,并进行更好的思考,我相信正确的方法是测试每个实现(在我的示例中,使用UserServiceImpl userService).
解决方法:
为了使您的UserServiceImpl在使用@InjectMocks进行注释时自动装配,那么它需要注册为Spring Bean本身.您可以通过使用@Service注释UserServiceImpl类来最简单地执行此操作.
这将确保在Spring引导配置中通过组件扫描将其拾取. (只要扫描包括您的服务类别所在的软件包!)
内容总结
以上是互联网集市为您收集整理的java-在Spring Boot中使用模拟对单元实现进行接口测试全部内容,希望文章能够帮你解决java-在Spring Boot中使用模拟对单元实现进行接口测试所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。