我在为应用程序编写单元测试时遇到一些问题。目前,我正在测试A类。在我正在测试的类 A 的方法中,它调用一个帮助类的方法,然后调用同一个帮助类 (getKeyObject( 中的另一个方法,其唯一功能是调用我正在使用的框架中包含的类的静态方法(buildKeyObject(((。我正在尝试存根 getKeyObject((,以便它返回正常生成的对象的模拟,但我不知道如何继续。
我想的一种方法是利用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.
}
}
你们能帮我吗?
构造函数注入是执行此操作的常用方法之一。它确实要求您修改要测试的类以便于测试。
首先,不要在方法中创建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());
// ...
}