Meow
Meow

Reputation: 19071

How to mock object inside of static method?

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

Answers (1)

user180100
user180100

Reputation:

One way is to change the signature of run:

public static SomeObject run(ImageReader imageReader, String path) {
    // ...

Upvotes: 4

Related Questions