我是Java新手,想了解如何使用EasyMock在Java中为这种方法编写UT。
public class MyClass{
public ClassB classBObj;
public int myMethod(SomeClass someClassObj){
ClassA objA = new ClassA();
objA.addParam(classBObj);
ClassC classCObj = objA.getClassCObj(classBObj);
return someClassObj.getResult(classCObj);
}
}
我可以创建SomeClass,ClassB的模拟但是如何模拟ClassA和ClassC的行为?基本上我想定义ClassA的行为,即" addParam"和" getClassCObj" 。我怎样才能做到这一点 ?
我需要测试" myMethod"这个" MyClass" 谢谢。
答案 0 :(得分:1)
因为ClassA对象是在方法中实例化的,所以你无法用EasyMock来模拟它。
如果您不想模拟ClassA对象,那么您可以添加模拟ClassB
实例所需的任何期望值,然后使用capture
检查ClassC
对象已按预期构建。
所以你的测试看起来像这样:
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
import org.easymock.Capture;
import org.easymock.EasyMock;
import org.junit.Before;
import org.junit.Test;
public class MyClassTest {
private MyClass myClass;
private SomeClass mockSomeClassObj;
private ClassB mockClassBObj;
@Before
public void setUp() throws Exception {
this.mockSomeClassObj = EasyMock.createMock(SomeClass.class);
this.mockClassBObj = EasyMock.createMock(ClassB.class);
this.myClass = new MyClass();
this.myClass.classBObj = this.mockClassBObj;
}
@Test
public void thatMethodDoesExpectedThings() {
//Add some expectations for how the mockClassBObj is used within the addParam and getClassCObj methods
final Capture<ClassC> classCCapture = new Capture<ClassC>();
EasyMock.expect(this.mockSomeClassObj.getResult( EasyMock.capture(classCCapture) ) ).andReturn(9);
EasyMock.replay(this.mockClassBObj, this.mockSomeClassObj);
final int result = this.myClass.myMethod(this.mockSomeClassObj);
assertThat(result, is(9));
EasyMock.verify(this.mockClassBObj, this.mockSomeClassObj);
final ClassC classCobject = classCCapture.getValue();
//Some assertions about the classC object
}
}
说完所有这些之后,可以使用 PowerMock 来模拟ClassA类的构造函数(假设您被允许使用PowerMock)
查看根documentation for powermock here以及Constructor mocking here
的特定文档