繁体   English   中英

在Spring / Maven项目中进行Junit测试

[英]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.findOnedoesUserExist方法。 您的单元测试将失败,然后开发人员将必须弄清楚是由于重构还是需要修复重构,是否需要更改测试。

我什至不确定如果删除findOne方法将要测试什么以及如何计划这样做。

MockitoSpring使Mockito变得非常简单。 您需要做的就是定义并启动模拟userRepository ,然后根据输入定义行为。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM