PowerMockito издевается над общим конструктором

1

У меня есть класс, который объявляется следующим образом:

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)

Есть ли способ получить общий конструктор для возврата определенного объекта в такую ситуацию?

Теги:
generics
powermock
junit
mockito

1 ответ

1
Лучший ответ

Основная причина вашей ошибки заключается в том, что тип параметра для конструктора - это просто Class во время выполнения (и Class<T> во время компиляции, никогда не MyWebServiceResponse).

Поэтому использование

.withParameterTypes(Class.class)

должно сработать.

  • 0
    Это устраняет исключение, хотя я не думаю, что на самом деле GenericFoo работает: конкретный экземпляр не возвращается при GenericFoo последующих экземпляров GenericFoo , возвращается обычный экземпляр, который выполняет другой код и выдает результат различий.
  • 0
    Может быть, вы забыли использовать @PrepareForTest ?
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню