2013-04-03 117 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); –