Reputation: 19071
I'm trying to mock static method inside of static method.
I wonder if it is possible without using any framework.
Below is what I have tried.
Goal: Mock ImageIO object so that I know what to expect for return value.
class Foo {
public static SomeObject Run(String path) {
File file = new File(path);
BufferedImage buff = ImageIO.read(file);
SomeObject some = new SomeObject(buff);
return some;
}
}
I first tried using interface and create a wrapper for ImageIO.
interface ImageReader {
public BufferedImage read(File file);
}
class RealReader implements ImageReader {
@Override
public BufferedImage read(File file) {
return ImageIO.read(file);
}
}
class MockReader implements ImageReader {
@Override
public BufferedImage read(File file) {
BufferedImage buff = new BufferedImage(0,0,0);
//do whatever I like here and return the buff
return buff;
}
}
class Foo {
public static SomeObject run(String path) {
File file = new File(path);
//ImageIO wrapper
ImageReader reader = getImageReader();
BufferedImage buff = reader.read(file);
SomeObject some = new SomeObject(buff);
return some;
}
public static getImageReader() {
return RealReader();
}
}
And I tried to override static getImageReader() so that I can return MockReader object which then call mock version of read() method:
class MockFoo {
@Override
public static getImageReader() {
return MockReader();
}
}
This is my test code:
public void TestRun() {
MockFoo foo = new MockFoo();
foo.run();
}
Then I figured I can't override static method getImageReader()......
Is there a way to achieve my goal?
Upvotes: 5
Views: 1488
Reputation:
One way is to change the signature of run
:
public static SomeObject run(ImageReader imageReader, String path) {
// ...
Upvotes: 4