模拟测试类中的方法不起作用

时间:2013-10-16 06:44:32

标签: junit4 easymock powermock

让我们说以下是我需要测试的课程

public class ClassToTest{
//some code
    SomeOtherClass soc = new SomeOtherClass();
    Object returnedObject = soc.doMethodCall(passedObject);
}

我不想让实际的doMethodCall发生,我需要模拟它并返回我自己的值。

在mytest课程中,我添加了preprare以测试SomeOtherClass

@PrepareForTest({ SomeOtherClass.class})

我按照以下方式进行了嘲笑。

SomeOtherClass mockSoc = EasyMock.createMock(SomeOtherClass.class);
Easymock.expect(mockSoc.doMethodCall((ParamClass)EasyMock.anyObject())).andReturn(null);
EasyMock.replayAll();

问题是拦截方法调用并返回null而不是方法调用没有发生,单元测试进入doMetodCall(我不想要)并产生空指针错误。

我做错了什么。

1 个答案:

答案 0 :(得分:0)

<强> 修改

我对这个问题的原始答案是正确的,但对于原因却非常具体。在完成了更多阅读和使用PowerMock之后,我自己也遇到过这个问题。您面临的问题是因为需要为测试做准备的类是您正在测试的类,而不是您正在嘲笑构造的类。

因此,要解决您的问题,请将@PrepareForTest({ SomeOtherClass.class})更改为@PrepareForTest({ ClassToTest.class})

结束编辑


我最近一直在阅读PowerMock并且遇到了这个页面:How to mock object instantiation with PowerMock

我已经测试了你的场景,我自己创建了几个类。所以这里是我为测试你的场景而创建的测试类:

public class Class2 {
    public Object doMethodCall(final Object passedObject) {
        return passedObject.toString();
    }
}

public class Class1 {
    public Object method(final Object passedObject) {
        final Class2 class2 = new Class2();
        return class2.doMethodCall(passedObject);
    }
}

使用该页面上的建议,我创建了以下测试方法,该方法成功运行并测试在新实例上调用该方法。

@RunWith(PowerMockRunner.class)
@PrepareForTest(Class1.class)
public class Class1Test {

    @Test
    public void testMethod() throws Exception {
        final Object passedObject = new Object();
        final Class2 mockClass2 = PowerMock.createMock(Class2.class);

        PowerMock.expectNew(Class2.class).andReturn(mockClass2);
        EasyMock.expect(mockClass2.doMethodCall(passedObject)).andReturn("YEAH!");

        PowerMock.replay(mockClass2, Class2.class);

        final Class1 class1 = new Class1();
        final Object returnedValue = class1.method(passedObject);
        Assert.assertEquals(returnedValue.toString(), "YEAH!");

        PowerMock.verify(mockClass2, Class2.class);
    }
}