假设以下是我需要测试的类
public class ClassToTest{
//some code
SomeOtherClass soc = new SomeOtherClass();
Object returnedObject = soc.doMethodCall(passedObject);
}
我不想让实际的doMethodCall发生,我需要模拟它并返回我自己的值。
在我的测试类中,我为SomeOtherClass的测试添加了准备
@PrepareForTest({ SomeOtherClass.class})
我做了如下嘲笑。
SomeOtherClass mockSoc = EasyMock.createMock(SomeOtherClass.class);
Easymock.expect(mockSoc.doMethodCall((ParamClass)EasyMock.anyObject())).andReturn(null);
EasyMock.replayAll();
问题是拦截方法调用并返回 null 而不是方法调用没有发生,单元测试进入 doMetodCall(我不想要)并产生空指针错误。
我做错了什么。
编辑
我对这个问题的最初回答是正确的,但真的很具体为什么。在对 PowerMock 进行了更多的阅读和使用之后,我自己也遇到了这个问题几次。你面临的问题是,需要准备测试的类是你正在测试的类,而不是你嘲笑构造的类。
因此,要解决您的问题,请将@PrepareForTest({ SomeOtherClass.class})
更改为@PrepareForTest({ ClassToTest.class})
结束编辑
我最近一直在阅读PowerMock,并看到了这个页面:如何使用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);
}
}