У меня есть класс, который объявляется следующим образом:
public class GenericFoo<T>
{
private final Class<T> _c;
public GenericFoo(Class<T> c)
{
this._c = c;
}
/*
...
rest is unimportant
*/
}
Я пишу unit тест для класса, называю его SomeBar
который создает и использует экземпляры GenericFoo
. Для этого теста мне нужен конструктор, чтобы всегда возвращать определенный GenericFoo
.
MyWebServiceResponse webServiceResponseObject = setUpTestResponseObject(1,2,3);
GenericFoo<MyWebServiceResponse> testFoo = PowerMockito.spy(new GenericFoo<MyWebServiceResponse>(MyWebServiceResponse.class));
PowerMockito.when(testFoo.processResponseObject(webServiceResponseObject))
.thenAnswer(new Answer<String>()
{
@Override
public String answer(InvocationOnMock invocation) throws Throwable
{
/* details unimportant */
}
});
Чтобы гарантировать, что testFoo
будет возвращен, когда SomeBar
создаст экземпляр GenericFoo<MyWebServiceResponse>
, я пробовал это:
PowerMockito.whenNew(com.myCompany.GenericFoo.class)
.withParameterTypes(MyWebServiceResponse.class)
.withArguments(MyWebServiceResponse.class)
.thenReturn(testFoo);
Это приводит к тому, что PowerMock создает ошибку:
org.powermock.reflect.exceptions.ConstructorNotFoundException: Failed to lookup constructor with parameter types [ com.myCompany.MyWebServiceResponse ] in class com.myCompany.GenericFoo. ...[stack trace snipped] Caused by: java.lang.NoSuchMethodException: com.myCompany.GenericFoo.(com.myCompany.MyWebServiceResponse)
Есть ли способ получить общий конструктор для возврата определенного объекта в такую ситуацию?
Основная причина вашей ошибки заключается в том, что тип параметра для конструктора - это просто Class
во время выполнения (и Class<T>
во время компиляции, никогда не MyWebServiceResponse
).
Поэтому использование
.withParameterTypes(Class.class)
должно сработать.
GenericFoo
работает: конкретный экземпляр не возвращается приGenericFoo
последующих экземпляровGenericFoo
, возвращается обычный экземпляр, который выполняет другой код и выдает результат различий.