Как смоделировать объект с помощью конструктора, который принимает класс? - PullRequest
11 голосов
/ 10 февраля 2011

Это тест:

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.Отсюда и ошибка.

Ответы [ 2 ]

17 голосов
/ 07 ноября 2011

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

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

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

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

2 голосов
/ 11 февраля 2011

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

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

найдено на http://code.google.com/p/powermock/wiki/SuppressUnwantedBehavior

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

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

...