我正在使用 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
。 mockito完全有能力处理这个问题,以及所有其他模拟框架。
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.
这意味着您正在进行集成测试。在这种情况下,您应该使用内存数据库,如 h2所以你仍然可以在 ci 上运行测试服务器。您必须以某种方式配置您的应用程序以从不同的地方获取 DataSource
。
最后的说明
本质上,您应该将所有内容的模拟注入(inject)到您的 Struts 操作类中。您可以告诉模拟在调用时返回任何值。然后,在调用 execute()
之后,您可以验证调用了给定的方法、字段集和结果值是否正确。考虑将其拆分为多个测试。
代码审查
- Struts 2 与 Spring 完美集成。如果您利用该功能,Spring 容器将自动将
MyDAO
注入(inject)到您的操作类中。第一行已过时。
关于java - 我如何在java中对这个方法进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10725969/