java - 我如何在java中对这个方法进行单元测试?

标签 java spring unit-testing dao

我正在使用 Struts2 框架并希望对下面的 execute 方法进行单元测试:

public String execute() {
    setDao((MyDAO) ApplicationInitializer.getApplicationContext().getBean("MyDAO"));
    setUserPrincipal(); //fetches attribute from request and stores it in a var
    setGroupValue(); //
    setResults(getMyDao().getReportResults(getActionValue(), getTabName());
    setFirstResultSet((List) getResults()[0]);
    setSecondResultSet((List) getResults()[1]);
    return SUCCESS;
}

如您所见,大部分逻辑都与数据库相关。那么我将如何对这个功能进行单元测试呢?我想通过模拟 HTTPServletRequest 来进行单元测试,其中包含很少的请求变量。

我的问题是:

  • 如何伪造/模拟一个请求变量,就好像它来自浏览器一样
  • 我的单元测试是否应该调用实际的 DAO 并确保数据返回?
  • 如果是这样,我如何从单元测试中调用 DAO,因为 DAO 与服务器相关联,因为 jndi 池设置驻留在应用程序服务器上。

如果有任何书籍/文章展示了如何真正做到这一点,我将不胜感激。

最佳答案

您向我们展示的代码不足以完全回答您的问题。

逐行

setDao((MyDAO) ApplicationInitializer.getApplicationContext().getBean("MyDAO"));

这是最难的一行,因为它使用静态方法。我们需要了解 ApplicationInitializer 是如何工作的。在理想世界中,getApplicationContext() 方法应该返回 ApplicationContext 的模拟。当 getBean("MyDAO") 时,这个 mock 又应该返回 MyDAO完全有能力处理这个问题,以及所有其他模拟框架。


setUserPrincipal(); //fetches attribute from request and stores it in a var

请求来自哪里?它是否注入(inject)到 Action 类中?如果是这样,只需注入(inject)模拟请求对象,例如MockHttpServletRequest .


setGroupValue(); //

和上面一样吗?请提供更多详细信息,此方法的实际作用是什么?


setResults(getMyDao().getReportResults(getActionValue(), getTabName());

当使用给定参数调用 getReportResults() 时,您之前创建的 mock 应该返回一些内容。


setFirstResultSet((List) getResults()[0]);
setSecondResultSet((List) getResults()[1]);

我猜下面的方法在 Action 类上设置了一些字段。因为您可以完全控制从模拟 getReportResults() 返回的内容,所以这不是问题。


return SUCCESS;

您可以断言 SUCCESS 是否是执行的结果。


现在一般

How can I fake/mock a request variable as if its coming from a browser

见上文,Spring 中内置了一个 mock。

Should my unit test be calling the actual DAO and making sure that the data is coming back?

如果你的单元测试调用了真正的DAO,它就不再是单元测试了。这是一个集成测试。

If so, how can I call the DAO from unit test since the DAO is tied to the server since jndi pool settings reside on the application server.

这意味着您正在进行集成测试。在这种情况下,您应该使用内存数据库,如 所以你仍然可以在 上运行测试服务器。您必须以某种方式配置您的应用程序以从不同的地方获取 DataSource


最后的说明

本质上,您应该将所有内容的模拟注入(inject)到您的 Struts 操作类中。您可以告诉模拟在调用时返回任何值。然后,在调用 execute() 之后,您可以验证调用了给定的方法、字段集和结果值是否正确。考虑将其拆分为多个测试。


代码审查

  • Struts 2 与 Spring 完美集成。如果您利用该功能,Spring 容器将自动将 MyDAO 注入(inject)到您的操作类中。第一行已过时。

关于java - 我如何在java中对这个方法进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10725969/

相关文章:

java - 如何使用 application.properties 在 Spring 中禁用 csrf?

java - 使用 JQuery 和 Java 在 Play Framework 中构建自动保存功能,但遇到 400 Bad Request 或 404 Not Found 错误

Java错误: Bad Operand Type for binary operator <

java - 如何在单元测试中站起来然后关闭 Solr 实例?

c# - 如何从 OpenCover 报告中排除类

unit-testing - 有单元测试计划这样的东西吗

java - JUnit 5 中的 @TestInstance 注释有什么用?

java - 使用 JSoup 转到 aspx 表单上的下一页

java - 如何在gradle Springboot REST应用程序中将heroku连接到mongodb?

java - 无法从 Spring 应用程序连接到 mssql 服务器