Как издеваться над объектом с конструктором, который принимает класс?

Это тест:

import static junit.framework.Assert.assertTrue;
import static org.powermock.api.mockito.PowerMockito.mock;
import static org.powermock.api.mockito.PowerMockito.whenNew;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

@RunWith(PowerMockRunner.class)
@PrepareForTest( {ClassUnderTesting.class} )
public class ClassUnderTestingTest {

    @Test
    public void shouldInitializeMocks() throws Exception {
        CollaboratorToBeMocked mockedCollaborator = mock(CollaboratorToBeMocked.class);

            suppress(constructor(CollaboratorToBeMocked.class, InjectedIntoCollaborator.class));

        whenNew(CollaboratorToBeMocked.class)
            .withArguments(InjectedAsTypeIntoCollaborator.class)
            .thenReturn(mockedCollaborator);

        new ClassUnderTesting().methodUnderTesting();

        assertTrue(true);
    }
}

Это классы:

public class ClassUnderTesting {

    public void methodUnderTesting() {
        new CollaboratorToBeMocked(InjectedAsTypeIntoCollaborator.class);
    }

}

public class CollaboratorToBeMocked {

    public CollaboratorToBeMocked(Class<InjectedAsTypeIntoCollaborator> clazz) {
    }

    public CollaboratorToBeMocked(InjectedIntoCollaborator someCollaborator) {
    }

    public CollaboratorToBeMocked() {
    }

}

public class InjectedAsTypeIntoCollaborator {

}

public class InjectedIntoCollaborator {

}

Это ошибка:

org.powermock.reflect.exceptions.TooManyConstructorsFoundException: Several matching constructors found, please specify the argument parameter types so that PowerMock can determine which method you're refering to.
Matching constructors in class CollaboratorToBeMocked were:
CollaboratorToBeMocked( InjectedIntoCollaborator.class )
CollaboratorToBeMocked( java.lang.Class.class )

Вот вопрос : как я могу заставить PowerMock выяснить, какой конструктор искать?

Проблематичная строка - это suppress. Вот откуда исходит ошибка.

Ответ 1

Возможно, слишком поздно для вашего вопроса. Я встретил его сегодня и нашел решение по следующему URL-адресу. В принципе, вам нужно указать свой тип аргумента, как.

whenNew(MimeMessage.class).**withParameterTypes(MyParameterType.class)**.withArguments(isA(MyParameter.class)).thenReturn(mimeMessageMock); 

http://groups.google.com/group/powermock/msg/347f6ef1fb34d946?pli=1

Надеюсь, это может вам помочь.:)

Ответ 2

Я не знал о PowerMock, пока вы не написали свой вопрос, но немного почитал и нашел это в их документации. Тем не менее, я не совсем уверен, поможет ли это вам:

Если у суперкласса есть несколько конструкторов, можно указать PowerMock подавить только определенный. Допустим, у вас есть класс ClassWithSeveralConstructors, у которого есть один конструктор, который принимает String и другой конструктор, который принимает в качестве аргумента int и вы хотите только подавить конструктор String. Вы можете сделать это, используя suppress(constructor(ClassWithSeveralConstructors.class, String.class)); метод.

находится по адресу http://code.google.com/p/powermock/wiki/SuppressUnwantedBehavior

Разве это не то, что вы хотели?

РЕДАКТИРОВАТЬ: Теперь я вижу, вы уже пытались подавить. Но вы уверены, что правильно поняли вызов подавления? Разве первым аргументом constructor() должен быть класс, в котором вы хотите превзойти конструктор?