为应用程序编写单元测试时遇到了麻烦。目前,我正在测试A类。在AI类测试的方法中,它调用帮助程序类的方法,该方法然后在同一帮助程序类(getKeyObject)中调用另一个方法,该方法的唯一功能是调用静态方法。我正在使用的框架中包含的类(buildKeyObject())。我正在尝试对getKeyObject()进行存根,以便它返回通常生成的Object的模拟,但是我不知道如何进行。
我认为的一种方法是利用PowerMockito并使用PowerMockito.mockStatic(ClassInFramework.class)
方法在我正在使用的框架中创建类的模拟,然后再使用when(ClassInFramework.buildKeyObject()).thenReturn(KeyObjectMock)
,但是由于工作上的某些限制我在做,我被禁止使用PowerMockito。由于相同的原因,我也无法使用Mockito.spy或@spy批注。
class ATest{
public A aInstance = new A();
@Test
public void test(){
KeyObject keyObjectMock = Mockito.mock(KeyObject.class);
/*
between these 2 lines is more mockito stuff related to the KeyObjectMock above.
*/
String content = aInstance.method1();
Assert.assertEquals(content, "string")
}
}
class A{
public RandomClass d = new RandomClass()
public String method1(){
Helper helper = new Helper();
Object a = helper.method2()
return d.process(a);
}
}
class Helper{
public Object method2(){
KeyObject keyObject = getKeyObject();
Object object = keyObject.getObject();
return object;
}
public KeyObject getKeyObject(){
return ClassInFramework.buildKeyObject(); //static method call.
}
}
你们能帮我吗?
答案 0 :(得分:1)
构造函数注入是执行此操作的常见方法之一。确实需要您修改被测类以简化测试。
首先,不要在方法中创建new Helper
,而是使其成为成员变量并在构造函数中进行分配。
class A {
private Helper helper;
// constructor for test use
public A(Helper helper) {
this.helper = helper;
}
// convenience constructor for production use
public A() {
this(new Helper());
}
}
现在,在您的测试中,您可以使用测试构造函数注入从Helper
派生的任何模拟对象。可以使用Mockito甚至简单的继承来完成。
class MockHelper extends Helper {
// mocked methods here
}
class ATest {
public A aInstance = new A(new MockHelper());
// ...
}