Как издеваться над объектом с конструктором, который принимает класс?
Это тест:
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()
должен быть класс, в котором вы хотите превзойти конструктор?