【问题标题】:Junit testing in a Spring / Maven project在 Spring / Maven 项目中进行 Junit 测试
【发布时间】:2015-09-04 14:32:26
【问题描述】:

我在为 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 部分并只比较字符串吗?

【问题讨论】:

    标签: java spring mongodb junit


    【解决方案1】:

    在不应该涉及数据库的单元测试中,您正面临一个非常常见的问题(即集成测试),所以...这里是 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(...) 方法作为一个单元进行测试的想法。当您需要通过调试代码来学习时,这也很有帮助。

    【讨论】:

    • 谢谢!我将开始阅读 mockito 框架并将其实施到项目中。您提供的示例非常有用:)
    【解决方案2】:

    不,不过分。单元测试的想法是根据不同的输入测试方法的行为,并确保它的行为符合预期。它还记录了您的期望,并使重构的痛苦大大减轻。

    想象一下将来有人(甚至可能是你)会决定从doesUserExist 方法中删除userRepository.findOne。您的单元测试将失败,然后开发人员必须确定是否需要因重构而更改测试或需要修复重构。

    我什至不确定如果你删除 findOne 方法你会测试什么以及你打算如何做。

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

    【讨论】:

    • 很好的解释,它背后的理论让我们更深入地了解如何在 Spring 项目中使用 jUnit。谢谢你:)
    猜你喜欢
    • 1970-01-01
    • 2019-03-05
    • 2012-10-19
    • 1970-01-01
    • 2014-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多