[英]Junit testing in a Spring / Maven project
我在为Spring项目编写Junit测试用例时遇到问题。 关于以下方法;
boolean doesUserIdExist(String userId){
if(userRepository.findOne(userId.toLowerCase()) != null) {
throw new userAlreadyExistsException("User with id: " + userId + " already exists")
return false;
}else{
return true;
}
}
现在在我的jUnit中,我写了这样的东西..:
void compareDuplicateUserIdTest (){
UserService UserService = new UserService();
String lowercase = "test";
String uppercase = "Test";
boolean result = userService.doesUserIdExist(lowercase);
//Check the boolean result if its true
}
由于即时通讯使用的是findOne方法,这意味着我必须对照DB userId =“ test”检查String =“ test”。 这不是正确的方法,因为它应该独立运行而在MongoDB数据库中没有任何记录。
现在,我一直在阅读有关诸如Mockito之类的框架来对此进行测试,但是对于这种简单的方法检查来说,这不是“太多”了吗? 我可以删除findOne部分并仅比较字符串吗?
您在单元测试中面临一个非常普遍的问题,即不应涉及数据库(这将是集成测试),因此... Mockito是一个很好的工具。
使用Mockito可以模拟数据库结果并继续常规方法的流程,因此您可以执行以下操作:
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.when;
@RunWith(MockitoJUnitRunner.class)
public class UserService_doesUserIdExistTests
{
@Mock
private UserRepository userRepository;
@InjectMocks
private UserService userService;
@Test
void compareDuplicateUserIdTest() {
String lowercase = "test";
// Mocking the response for your method that uses external dependencies
when(userRepository.findOne(lowercase)).thenReturn(true); // You can mock the response you want using .thenReturn(...)
// Test your userService method (you can also debug it if needed)
boolean result = userService.doesUserIdExist(lowercase);
//Check the boolean result if its true
assertTrue(result);
}
}
我尚未测试代码,但显示了将userService.doesUserIdExist(...)
方法作为一个单元进行测试的想法。 当您需要通过调试代码学习时,这也很有帮助。
不,不是太多。 单元测试的思想是基于不同的输入来测试方法的行为,并确保其行为符合预期。 它还记录了您的期望,并减少了痛苦。
试想一下,在未来的某个人(甚至可能你)会决定删除userRepository.findOne
从doesUserExist
方法。 您的单元测试将失败,然后开发人员将必须弄清楚是由于重构还是需要修复重构,是否需要更改测试。
我什至不确定如果删除findOne
方法将要测试什么以及如何计划这样做。
Mockito
和Spring
使Mockito
变得非常简单。 您需要做的就是定义并启动模拟userRepository
,然后根据输入定义行为。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.