EasyMock:如何测试这种方法

时间:2014-06-27 06:03:45

标签: java unit-testing easymock

我是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" 谢谢。

1 个答案:

答案 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

的特定文档