我有一个需要进行单元测试的课程。结构如下:
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
中方法的结构,这意味着classToBeTested
和classA
紧密耦合。因此,通过TDD方法,我们需要重构代码
在上面的例子中:
而不是使用
classA object = new classA(V);
最好将方法提供给方法(例如:在Spring MVC中自动装配classA object
)。
接受建议。如果有人能给出更好的解释,请这样做。
答案 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
}
}