Spock and Roo = easier add-on testing, part 2
Thursday, May 24, 2012 at 6:30AM Moving on to some more interesting tests. Given this method:
public boolean isInstalljQueryCommandAvailable() {
String jsLocation = pathResolver.getFocusedIdentifier(
Path.SRC_MAIN_WEBAPP, "/js");
return fileManager.findMatchingAntPath(
jsLocation + "**/jquery-1.*.min.js").isEmpty();
}
I want to use Spock to test it. The challenge is the somewhat more nested set of objects. My add-on extends the AbstractOperations class (to get the embedded fileManager), so I need to mock that, plus mock the path resolver I've mounted with @Reference in my add-on as well.
To set it up I do this:
class JqueryuiOperationsImplTest extends spock.lang.Specification {
JqueryuiOperationsImpl operations;
def setup() {
operations = new JqueryuiOperationsImpl();
operations.pathResolver = Mock(PathResolver);
operations.fileManager = Mock(FileManager);
}
Spock mocks are similar to EasyMock, in that we then detail our assertions of what should happen before the test runs. In fact, based on a really interesting thread I found this AM while banging my head against the wall (don't do that, it hurts), if you put any mocking assertions in the when: part of a Spock test, it moves them to the setup: block. Anyway, here is my set of assertions:
def "isJqueryInstallAvailable called and happy path"() {
setup:
1* operations.pathResolver.getFocusedIdentifier(
_, _) >> "src/main/webapp/js"
1* operations.fileManager.findMatchingAntPath(
_ as String) >> new TreeSet<FileDetails>()
I'm using Spock's matchers to eat the expressions - I don't really care what we pass to the getFocusedIdentifier or findMatchingAntPath methods, I just want them mocked and I want them to return values.
The >> is what tells us that we're stubbing the return output.
Here is the full test:
def "isJqueryInstallAvailable called and happy path"() {
setup:
1* operations.pathResolver.getFocusedIdentifier(
_, _) >> "src/main/webapp/js"
1* operations.fileManager.findMatchingAntPath(
_ as String) >> new TreeSet<FileDetails>()
when:
def result = operations.isInstalljQueryCommandAvailable();
then:
result == true
}
Don't do what I did to get my head bruised. I originally wrote this:
1* operations.fileManager.findMatchingAntPath(
_ as String).empty() >> false
I got my brain mixed up because I saw the line:
return fileManager.findMatchingAntPath(
jsLocation + "**/jquery-1.*.min.js").isEmpty();
And that's going to throw a tasty NullPointerException because you're mocking the return of the method in fileManager, not the return statement! Oh, bother.
chariot-news,
roo add-ons,
spring-roo in
Spring Roo
Reader Comments