Easymock新对象并处理其函数调用(No PowerMock)

时间:2017-07-18 05:36:38

标签: scala unit-testing mocking scalatest easymock

我有一个需要进行单元测试的课程。结构如下:

public class classToBeTested{
    public returnType function1(){
        //creation of variable V
        return new classA(V).map();
    }
}

班级A如下:

public class classA{
    //Constructor
    public returnType map(){
        //Work
    }
}

我使用FunSuite,GivenWhenThen和EasyMock在Scala中创建单元测试 我的测试结构如下:

class classToBeTested extends FunSuite with GivenWhenThen with Matchers with EasyMockSugar {
    test(""){
        Given("")
        val c = new classToBeTested()
        expecting{
        }
        When("")
        val returnedResponse = c.function1()
        Then("")
        //checking the returned object
    }
}

我需要写什么期望?
我该如何处理上述情况?

注意:无法使用PowerMock。

  

答案:   谢谢,@ Henri。经过大量的搜索和@Henri提供的答案重构代码是处理这种情况的最佳方法。原因如下:

单元测试无法模拟new调用创建的对象(没有PowerMock)。因此,为了测试代码,我们需要根据要测试的类中使用的类中的条件(此处为classA)编写单元测试(此处为classToBeTested)。因此,在测试classToBeTested时,我们需要了解classA的功能和结构,并分别创建测试用例。

现在,测试用例取决于classA中方法的结构,这意味着classToBeTestedclassA紧密耦合。因此,通过TDD方法,我们需要重构代码 在上面的例子中:
而不是使用

classA object = new classA(V);

最好将方法提供给方法(例如:在Spring MVC中自动装配classA object)。

  

接受建议。如果有人能给出更好的解释,请这样做。

1 个答案:

答案 0 :(得分:0)

你不能。您想要模拟的实例化是在您要测试的类中。所以没有powermock,你需要重构才能使它工作。

最小的方法是将类创建提取到另一种方法

public class classToBeTested{
    public returnType function1(){
        //creation of variable V
        return getClassA(V).map();
    }

    protected classA getClassA(VClass v) {
        return new classA(v);
}

然后,你可以做部分嘲笑。我不知道如何在scala中执行此操作,因此下面的代码可能不对,但我希望您能理解。

class classToBeTested extends FunSuite with GivenWhenThen with Matchers with EasyMockSugar {
    test(""){
        Given("")
        val c = partialMockBuilder(classToBeTested.class).addMockedMethod("getClassA").build()
        val a = mock(classA.class)
        expecting{
            expect(c.getClassA()).andReturn(a)
            expect(a.map()).andReturn(someReturnType)
        }
        When("")
        val returnedResponse = c.function1()
        Then("")
        //checking the returned object
        // whatever you need to check
    }
}