2012-12-20 25 views
3

我試圖嘲笑靜態方法內的靜態方法。如何模擬靜態方法內的對象?

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

下面是我試過的。

目標:模擬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對象 然後調用讀的模擬版本()方法:

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

這是我的測試代碼:

public void TestRun() { 

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

} 

然後我想我不能重寫靜態方法getImageReader()......

有沒有辦法達到我的目標?

回答

3

一種方法是改變run簽名:

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

+1。是的,我就是這麼做的。 –

+0

我同意,這是我可以想到沒有框架的方式。謝謝你的提示! –