2013-02-06 98 views
2

可以说我有以下代码:
嘲笑对象类如何初始化模拟对象?

public class SomeClass { 
    private Foo someField; 
    public SomeClass { 
     someField = new Foo(); 
    } 
    public Foo getSomeField { return someField; } 
    public void getSomething() {} 
    public boolean doSomething(Object object) {} 
} 

接着我有测试套件

public class TestSuite { 
    private ClassToTest classToTest; 
    private SomeClass mock; 

    @Before 
    public void setUp() { 
     classToTest = new ClassToTest(); 
     mock = EasyMock.createMock(SomeClass.class); 
    } 

    @Test 
    public void testMethod() throws Exception { 
     mock.getSomething(); 
     EasyMock.replay(mock); 

     classToTest.methodToTest(mock); //Where methodToTest accepts SomeClass and int 

     EasyMock.verify(mock); 
    } 
} 

和被测试方法

public void methodToTest(SomeClass a) { 
    //Logic here 
    Foo b = a.getSomeField(); 
    b.do(); // <--- null pointer exception here because someField isn't initialized 
    a.getSomething(); // <--- thing I want to test if it is being called, but can't due to exception prior to this line 
    //Logic after 
} 

我卡住了..所以基本上SomeClass是不是像我想要的初始化。有什么解决方法吗?或者可能有其他的框架可以做到这一点?

回答

2

您的methodToTest调用a.getSomeField(),但您的测试的设置部分不期望该调用。你想要的东西,如:

Foo foo = new Foo(); 
EasyMock.expect(mock.getSomeField()).andReturn(foo); 

或者存根电话:

Foo foo = new Foo(); 
EasyMock.expect(mock.getSomeField()).andStubReturn(foo); 

(你的电话之前,mock.getSomething())。

有关andReturnandStubReturn之间的差异,请参阅this question

+0

你是对的我忘了测试它。但事实并非如此。问题是你可以看到我的构造函数初始化'someField',并且当我进行模拟时,'someField'为空,结果整个'methodToTest'中断。那意味着构造函数没有被调用? – randomUser56789

+0

@ su234fk234hawuhsafklsfjs:你的*正常*实现做什么是无关紧要的。你在嘲笑那个班级,所以它的行为并不重要。只要你嘲笑你正在做的调用,以便'getSomeField()'返回一个非空引用,这没关系。 –

+0

但问题是'getSomeField();'返回null,因为'SomeClass'初始化'someField'没有别的也没有setter。我不明白如果通过'b.do();' – randomUser56789