How can I unit test this method in java?
dao, java, spring, unit-testing
Solution
The code you have shown us is not enough to fully answer your question.
Line by line
setDao((MyDAO) ApplicationInitializer.getApplicationContext().getBean("MyDAO"));
This is the hardest line since it uses static method. We would need to see how `ApplicationInitializer` works. In ideal world the `getApplicationContext()` method should return mock of `ApplicationContext`. This mock in turns should return `MyDAO` when `getBean("MyDAO")`. mockito is perfectly capable of handling this, as well as all other mocking frameworks.
setUserPrincipal(); //fetches attribute from request and stores it in a var
Where does the request come from? Is it injected to action class? If so, simply inject mocked request object, e.g. `MockHttpServletRequest`.
setGroupValue(); //
Same as above? Please provide more details, what this method actually does?
setResults(getMyDao().getReportResults(getActionValue(), getTabName());
Your previously created mock should return something when `getReportResults()` is called with given arguments.
setFirstResultSet((List) getResults()[0]);
setSecondResultSet((List) getResults()[1]);
I guess methods below set some field on the action class. Because you have full control over what was returned from mocked `getReportResults()`, this is not a problem.
return SUCCESS;
You can assert whether `SUCCESS` was the result of execution.
Now in general
How can I fake/mock a request variable as if its coming from a browser
See above, there is a mock built-in in Spring.
Should my unit test be calling the actual DAO and making sure that the data is coming back?
If your unit test calls real DAO, it is no longer unit test. It is an integration test.
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.
This means you are doing integration testing. In that case you should use in-memory database like h2 so you can still run the test on ci server. You must somehow configure your application to fetch `DataSource` from different place.
Final note
In essence you should inject mocks of everything to your Struts action class. You can tell mocks to return any value upon calling. Then, after calling `execute()`, you can verify given methods were called, fields set and result value is correct. Consider splitting this to several tests.
Code review
- Struts 2 integrates perfectly with Spring. If you take advantage of that functionality Spring container will automatically inject `MyDAO` to your action class. The first line becomes obsolete.
Problem
I'm working with the Struts2 framework and would like to unit test the `execute` method below: ``` 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; } ``` As you can see most of the logic is database related. So how would I go about unit testing this functionality? I would like to unit test by mocking a `HTTPServletRequest` with few request variables inside it. My questions are: - How can I fake/mock a request variable as if its coming from a browser - Should my unit test be calling the actual DAO and making sure that the data is coming back? - 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. I'd appreciate any book/article that shows how to really accomplish this.