Reputation: 5655
I am trying to mock the one of static method readAttributes
using groovy's metaClass
convention, but the real method get invoked.
This is how I mocked the static function:
def "test"() {
File file = fold.newFile('file.txt')
Files.metaClass.static.readAttributes = { path, cls ->
null
}
when:
fileUtil.fileCreationTime(file)
then:
1 * fileUtil.LOG.debug('null attribute')
}
Am I doing something wrong here?
My java method
public Object fileCreationTime(File file) {
try {
BasicFileAttributes attributes = Files.readAttributes(file.toPath(), BasicFileAttributes.class);
if(attributes == null) {
LOG.debug("null attribute");
}
//doSomething
} catch (IOException exception) {
//doSomething
}
return new Object();
}
Upvotes: 8
Views: 25902
Reputation: 169
you can use GroovySpy for this, as stated in spock documentation
In your case, it would be:
def filesClass = GroovySpy(Files, global: true)
filesClass.readAttributes(*_) >> null
Upvotes: 4
Reputation: 5655
I resolved the issue using one level of indirection. I created an instance method of the test class
which acts like a wrapper for this static call.
public BasicFileAttributes readAttrs(File file) throws IOException {
return Files.readAttributes(file.toPath(), BasicFileAttributes.class);
}
and from the test I mocked the instance method.
FileUtil util = Spy(FileUtil);
util.readAttrs(file) >> { null }
which resolved my issue.
Upvotes: 8
Reputation: 84756
The short answer is that it's not possible, please have a look at this question.
It would be possible if either:
The workaround is to extract the logic returning the attributes to another class which will be mocked instead of use Files
directly.
Upvotes: 5