Как определить, к какому классу относится макет объекта JMock? - PullRequest
0 голосов
/ 30 декабря 2011

Скажем, у меня есть фиктивная установка, подобная этой:

JUnit4Mockery context = new JUnit4Mockery();
MyInterface mock = context.mock(MyInterface.class);

А позже я хочу исследовать мой фиктивный объект, чтобы выяснить, к какому классу он насмехается:

Class mockedClass = mock.??? //would return MyInterface.class

IВ Javadocs JMock (2.5.1) не было ничего очевидного о том, как это сделать - подпись для метода mock

<T> T mock (Class<T> typeToMock)

В предыдущих версиях (я смотрел на 1.2.0)Вы должны создать объект Mock напрямую, и одним из его методов был

Class getMockedType()

. Я пытаюсь достичь структуры модульного тестирования для использования DI внутри моих модульных тестов.(Я использую Guice 3.0.) Наличие DI в тестах - это ограничение сервера / платформы приложений, с которой я работаю - объекты, которые я тестирую, являются подклассами мультитона с собственным Injector, которыйчто я пытаюсь заполнить.

Я бы предпочел не создавать анонимный экземпляр AbstractModule в каждом тесте, поэтому я пытаюсь создать что-то вроде этого (кажется, это сработало быв 1.2):

public class MockModule extends AbstractModule {
    private Iterable<Mock> mocks;

    public MockModule(Iterable<Mock> mocks) {
        this.mocks = mocks;
    }

    protected void configure() {
        for (Mock mock : mocks) {
            bind(mock.getMockedType()).toInstance(mock);
        }
    }
}

Единственное, чего не хватает, так это ответа (если он есть) на этот вопрос.

ОТВЕТ НА ПРИНЯТЫЙ ОТВЕТ

Вот что я создал для этого варианта использования:

import java.lang.reflect.Proxy;
import com.google.common.collect.Lists;
import com.google.inject.AbstractModule;

@SuppressWarnings({ "rawtypes", "unchecked" })
public class MockModule extends AbstractModule {
    private final Iterable mocks;

    public MockModule(Object mock) {
        mocks = Lists.newArrayList(mock);
    }

    public MockModule(Iterable mocks) {
        this.mocks = mocks;
    }

    protected void configure() {
        for (Object mock : mocks) {
            Class superclass = mock.getClass().getSuperclass();
            if (superclass != Object.class && superclass != Proxy.class) {
                bind(superclass).toInstance(mock);
                continue;
            }
            Class[] interfaces = mock.getClass().getInterfaces();
            if (interfaces.length > 0) {
                bind(interfaces[0]).toInstance(mock);
            }
        }
    }
}

Ответы [ 2 ]

1 голос
/ 30 декабря 2011
Class mockedClass = mock.getClass().getInterfaces()[0];
System.out.println("Class is " + mockedClass.getCanonicalName());

Будет печатать:

Interface is MyInterface

Возможно, есть более надежные способы сделать это, но он выполняет работу для этой конкретной версии JMock по крайней мере.

0 голосов
/ 30 декабря 2011

Я не уверен, что понимаю ваши мотивы сделать это.JMock обычно используется для модульного тестирования объекта или небольшого кластера объектов, что означает, что в тесте все обновлено.DI обычно включается на уровне интеграционного или приемочного тестирования, когда выполняет что-то, что больше похоже на реальный компонент.

Что вы пытаетесь показать, используя DI в тестах?

...