使用PowerMockito模拟参数化的构造函数



考虑下面给出的代码:

@Override
public void A()  {
    objectA = objectB.B();
    objectA.C(someValue);
        objectC = new constructor(objectA,callback());
        //Rest of the code
    }
}
public Callback callback() {
    return new callback() {
        @Override
        public void someMethod(someArgument) {
            //some Code         
       }
    };
}

我正在尝试编写一个单元测试案例:

  • 呼叫objectB.B()必须被模拟
  • 必须嘲笑对构造函数的呼吁

这是我使用Mockito和PowerMockito所做的:

@InjectMocks
ClassBeingTested testObject;
@Mock
ClassB objectB;  
@Mock
ClassC objectC;    
@Before()
public void setup()  {
    when(objectB.B()).thenReturn(new ObjectA("someValue"));
    whenNew(objectC.class).withArguments(any(),any()).thenReturn(objectC);
}
@Test()
public void testMethod() {
    testObject.A();
}

第一个模拟成功起作用,但是使用whenNew的第二个模拟失败了以下错误:

org.powermock.reflect.exceptions.constructornotfoundexception:class'classc'中没有参数类型中的构造函数:[null]

如果我使用withArguments(objectA, callback())在测试类中实现了回调,则称为实际构造函数。

我想模拟构造函数调用并限制对实际构造函数的调用。我怎样才能做到这一点?

我无法编辑代码设计,因为这超出了我的范围。

简而言之,由于使用了2个通用 any() MATCHERS。

当您使用.withArguments(...)并将两个设置为 any() > .withArguments(null, null)(由于任何()可能匹配包括nulls在内的任何东西),最终折叠为单个null和反射API(PowerMock很大程度上依赖)未能发现ClassC(null)的合适构造函数。

您可以查看执行作业的org.powermock.api.mockito.internal.expectation.AbstractConstructorExpectationSetup<T> 来源

要解决问题,请考虑使用.withAnyArguments()如果您不关心param类型并使所有可用的构造函数固执在使用 any() 时,请指定更多具体类型 whenNew(ClassC.class).withArguments(any(ClassA.class), any(Callback.class))

相关内容

  • 没有找到相关文章

最新更新