2013-04-03 63 views
1

我有一個abstract類,我想模擬出用於測試目的:createMock和非抽象的方法,抽象類

public abstract class Foo { 
    public abstract void bar(); 
    public void baz() { 
     System.out.print("Hi from baz!"); 
    } 
} 

如果我使用了EasyMock Foo mock = createNiceMock(Foo.class),然後調用mock.baz()我得到一個java.lang.NullPointerException 。如果我將baz()更改爲final,事情會很順暢(我認爲這與EasyMock無法模擬final方法有關),但我希望能夠在不這樣做的情況下致電baz()

有沒有辦法使用EasyMock創建一個模擬對象,允許我打電話給我的非abstract方法?

目前我使用的一個解決方法是:

Foo mock = new Foo() { 
    @Override 
    public void bar() { 
     return; 
    } 
} 

但這是超級難看。

回答

0

所以我找到了解決我的問題。您可以在EasyMock的創建局部嘲笑:

Foo mock = EasyMock.createMockBuilder(Foo.class) 
       .addMockedMethod("bar") 
       .createNiceMock(); 

的一個警告是,如果類有實例變量,因爲你不使用new他們不會被初始化!如果任何人有這方面的解決方法,這將是有用的。這是創建一個部分該類:

public abstract class Foo { 
    public double myInstanceVariable = 2; 
    public abstract void bar(); 
    public void baz() { 
     System.out.print("Hi from baz!"); 
    } 
} 

如果它可以調用mock.myInstanceVariable並獲得2

+0

關於您的解決方法,您可以只設置字段... Field field = Foo.class.getDeclaredField(fieldName); \t \t field.setAccessible(true); \t \t field.set(setFieldOn,value); –