mas*_*san 5 java static mocking
我正在尝试在静态方法中模拟静态方法。
我想知道是否可以不使用任何框架。
以下是我尝试过的。
目标: 模拟 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;
}
}
Run Code Online (Sandbox Code Playgroud)
我首先尝试使用接口并为 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();
}
}
Run Code Online (Sandbox Code Playgroud)
我试图覆盖静态 getImageReader() 以便我可以返回 MockReader 对象,然后调用 read() 方法的模拟版本:
class MockFoo {
@Override
public static getImageReader() {
return MockReader();
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的测试代码:
public void TestRun() {
MockFoo foo = new MockFoo();
foo.run();
}
Run Code Online (Sandbox Code Playgroud)
然后我想我不能覆盖静态方法 getImageReader() ......
有没有办法实现我的目标?
小智 4
一种方法是更改 的签名run:
public static SomeObject run(ImageReader imageReader, String path) {
// ...
Run Code Online (Sandbox Code Playgroud)