2014-10-21 5 views
2

У меня есть простой шаблон для динамической фабрики в Java (groovy на самом деле, но для всех целей, которые мы можем считать java), который получает операцию и динамически загружает обработчик для этой конкретной операции, читая ее из файл свойства с соответствующим именем.Загрузка модуля динамического класса

картина так просто, как имеющий базовый метод со следующей подписью:

class ReflectionFactory implements BaseFactory { 

    PropertyReader propertyReader 

    public ReflectionFactory(PropertyReader reader) { 
     this.propertyReader = reader 
    } 

    Adapter resolveAdapter(String serviceName) { 
    // TODO: Find service configuration in propertyReader and load via class loader 
     return defaultAdapter 
    } 
} 

функциональность в классе еще не реализован, и я хочу, чтобы реализовать его с помощью TDD, то есть, я хочу создайте тест, который будет проверять, что, учитывая serviceName, он вернет класс соответствующего типа.

Код, который загрузит класс будет выглядеть следующим образом:

String className = propertyReader.getProperty(serviceName) 
this.class.classLoader.loadClass(className, true, false) 

То, как я это вижу, мне нужно «макет» загрузчик классов, но очевидно, что я не хочу, чтобы ввести инъекции класс просто заменить эту строку:

this.class.classLoader.loadClass(className, true, false) 

есть ли способ, чтобы проверить, что ClassLoader в настоящее время вызывается с правильными параметрами? Другими словами, есть ли способ «издеваться» или «заменять» вызов классаLoader?

В идеале я бы смог сделать (псевдокод)

when(classLoader.loadClass("serviceName", true, false)).thenReturn(dummyClassInstance) 

Так что тестовый код будет выглядеть примерно так:

void testWhenResolveServiceAndClassPropertyDefinedInstansceIsCreated() { 

    serviceName = "myService" 
    when(propertyReader.getPropertyValue("myService")).thenReturn("com.mydomain.adapters.testAdapter") 
    when(classLoader.loadClass("com.mydomain.adapters.testAdapter", true, false)).thenReturn(testDummy) 

    def factory = new ReflectionFactory(propertyReader) 
    def adapter = factory.resolveAdapter(serviceName) 

    assertNotNull(adapter) 
    verify(classloader).loadClass("com.mydomain.adapters.testAdapter", true, false) 
} 

Я использую Mockito в качестве основы насмешливой, но ни в какие рамки насмешливой/solution is welcome

+0

Прежде чем я попытаюсь, вы могли бы предоставить полную реализацию образца ReflectionFactory и тест (с когда, тогда)? Может быть, не компиляция и не работает - просто хотите поймать всю картину. – Opal

+1

Реализация, как я определил, то есть функциональность еще не реализована. Посмотрите на отредактированный вопрос для получения подробной информации о тесте, который я хочу написать –

+0

Спасибо, попробуем это на вечернем UTC. – Opal

ответ

0

Насколько я понял, я могу предложить что-то подобное (тест написан в раме сфока):

@Grab('org.spockframework:spock-core:0.7-groovy-2.0') 
@Grab('cglib:cglib-nodep:3.1') 

import spock.lang.* 

class Test extends Specification { 
    def 'test'() { 
     given: 
     def propertyReader = GroovyMock(PropertyReader) 
     def loader = GroovyMock(ClassLoader)   

     and: 
     def serviceName = 'service' 
     def serviceClass = 'service.class' 
     def adapter = new Adapter() 

     and: 
     def factory = new ReflectionFactory() 
     factory.propertyReader = propertyReader 
     factory.loader = loader 

     when: 
     def ret = factory.resolveAdapter(serviceName) 

     then: 
     ret == adapter 
     1 * propertyReader.findProperty(serviceName) >> serviceClass 
     1 * loader.loadClass('service.class', true, false) >> adapter 
    } 
} 

class ReflectionFactory { 

    PropertyReader propertyReader 
    ClassLoader loader = getClass().getClassLoader() 

    Adapter resolveAdapter(String serviceName) { 
     def cls = propertyReader.findProperty(serviceName) 
     loader.loadClass(cls, true, false) 
    } 
} 

class PropertyReader { 
    String findProperty(String name) { 
     //some logic here 
    } 
} 

class Adapter {} 

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

+0

Это то, что вы искали? – Opal

Смежные вопросы