【问题标题】:How do I test business logic in a servlet using Junit?如何使用 Junit 在 servlet 中测试业务逻辑?
【发布时间】:2022-01-21 10:00:48
【问题描述】:

我有一个 servlet,它在调用 DAO 方法之前进行一些前置条件检查,如下所示:

private void processRequest(HttpServletRequest request, HttpServletResponse response){
        if(a condition is met)
            myDAOFunction();
        else
            redirect();
}

我应该如何构建我的单元测试来验证是否有某个请求,servlet 调用我的函数,以及其他不满足条件的请求是否会重定向页面?

我已经尝试过这个解决方案:因为如果我的DAO function 被调用,它会在数据库中进行一些更改,并且通过它我可以测试 servlet 是否正确处理请求和响应。但我认为这不是一个优雅的解决方案。

【问题讨论】:

    标签: java servlets junit


    【解决方案1】:

    那么你需要验证 servlet 是否可以正确地与 DAO 相关代码交互。如果您的设计已经将与 DB 交互相关的所有代码分离并封装在 DAO 服务类中,您可以通过使用 Mockito 模拟此 DAO 服务类来轻松测试它,然后验证模拟 DAO 服务上的预期方法是否被调用预期参数。如果不是,请重构您的代码,使其具有这个单独的 DAO 服务类。

    对于模拟 MockHttpServletRequestMockHttpServletResponsespring-test 已经提供了一些实用程序来创建它们,这些实用程序对于测试 Servlet 内容很有用。虽然它们主要是为使用 spring-mvc 编写的代码而设计的,但它也应该用于非 spring 编写的代码,并且与 Mockito 相比应该更方便使用。

    假设您的 servlet 名为 FooBarServlet,则测试用例可能如下所示:

    @ExtendWith(MockitoExtension.class)
    public class FooBarServletTest { 
    
            @Mock
            DaoService daoService;
    
            @Test
            void testSaveToDatabase(){
                        
                FooBarServlet sut = new FooBarServlet(daoService);
    
                MockHttpServletRequest request = MockMvcRequestBuilders.get("/foobar")
                    ......   
                    .buildRequest(new MockServletContext());
                MockHttpServletResponse response = new MockHttpServletResponse();
    
                sut.processRequest(request, response);
                verify(daoService).save("xxxxxx");
    
            }
    
            @Test
            void testRedirect(){
                        
                FooBarServlet sut = new FooBarServlet(daoService);
    
                MockHttpServletRequest request = MockMvcRequestBuilders.get("/foobar")
                    ......   
                    .buildRequest(new MockServletContext());
                MockHttpServletResponse response = new MockHttpServletResponse();
    
                sut.processRequest(request, response);
                verify(daoService,never()).save(any());
            }
    
    }
    

    【讨论】:

    • 我明白了,谢谢。假设那里的verify.save() 方法可以帮我验证daoService 是否确实对数据库进行了一些更改,而不是手动创建一个sql 字符串来查询相应的表以检查更改?
    • 如果是这样,它会在测试后自动回滚保存还是我必须手动这样做?我对 Mockito 有点陌生
    • Mockito创建的mocked只是内存中的一个java对象。它不会真正与您的数据库交互以将内容保存到其中。所以数据是否回滚与事物无关。
    猜你喜欢
    • 2021-06-16
    • 2012-02-05
    • 1970-01-01
    • 1970-01-01
    • 2011-03-31
    • 2011-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多