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();
}
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.
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.
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With