【问题标题】:How to mock object inside of static method?如何在静态方法中模拟对象?
【发布时间】:2012-12-20 07:54:07
【问题描述】:

我正在尝试在静态方法中模拟静态方法。

我想知道是否有可能不使用任何框架

以下是我尝试过的。

目标:模拟 ImageIO 对象,以便我知道返回值的期望值。

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;
  }
}

我首先尝试使用接口并为 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();
      }
  }

我试图覆盖静态 getImageReader() 以便我可以返回 MockReader 对象 然后调用模拟版本的 read() 方法:

class MockFoo {
    @Override
    public static getImageReader() {
        return MockReader();
    }
}

这是我的测试代码:

public void TestRun() {

    MockFoo foo = new MockFoo();
    foo.run();

}

然后我想我不能覆盖静态方法getImageReader()......

有没有办法实现我的目标?

【问题讨论】:

    标签: java static mocking


    【解决方案1】:

    一种方法是更改​​run的签名:

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

    【讨论】:

    • 我同意,这是我在没有框架的情况下可以想到的方式。感谢您的提示!
    猜你喜欢
    • 2016-09-13
    • 2012-05-01
    • 2011-05-02
    • 1970-01-01
    • 2010-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多