Скажем, у меня есть фиктивная установка, подобная этой:
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);
}
}
}
}