2016-07-15 6 views
1

Я только начал работать на платформе тестирования Spock для приложений Java. У меня нет опыта работы на Groovy. Как мы вводим макет в конструктор с использованием структуры Spock? Ниже приведен мой код и тестовый пример.Как вводить макет объекта в конструктор?

public class ResourceClass { 
    private final IDynamoDBMapper factory = new DefaultDynamoDBClientFactory(DynamoDBConfig.fromProperties()).mapperClient(); 

    private ServiceClass service; 

    @Inject 
    public ResourceClass(ServiceClass service) { 
     this.service = service; 
    } 
} 

И я попытался создать тестовый класс, как показано ниже.

class ResourceClassTest extends Specification { 
ResourceClass eventsResource 
ServiceClass service 

def setup() { 
    service = Mock(ServiceClass) 
    eventsResource = new ResourceClass(service) 
} 

Но я получаю ниже исключения при eventsResource = новый ResourceClass (услуга)

java.lang.NullPointerException: Domain name must be specified. 

at java.util.Objects.requireNonNull(Objects.java:228) 

Любые предложения, пожалуйста?

ответ

1

Проблема заключается не в «впрыскивании» макета в конструктор ResourceClass, поскольку вы просто вызываете конструктор, проходящий в макете. Причина происходит это исключение из этого поля декларации + initialiazation:

private final IDynamoDBMapper factory = new DefaultDynamoDBClientFactory(DynamoDBConfig.fromProperties()).mapperClient(); 

Инициализация поля фабрики будет происходить до того, как конструктор выполняется (это будет на самом деле скопирована в начале конструктора во время компиляции).

Вы можете проверить, почему инициализация фабрики не работает (например, проверка работы DynamoDBConfig.fromProperties() и где должно быть указано свойство домена для подключения динамо-db), или вы можете изменить исходный код, чтобы ввести фабричный объект в класс Resource, Точно так же, как вы делаете с сервисом, через конструктор, то в тесте проходит издеваться над IDynamoDBMapper в конструктор службы:

public class ResourceClass { 
    private final IDynamoDBMapper factory; 
    private ServiceClass service; 

    @Inject 
    public ResourceClass(ServiceClass service, IDynamoDBMapper factory) { 
     this.service = service; 
     this.factory = factory; 
    } 
} 

class ResourceClassTest extends Specification { 
    ResourceClass eventsResource 
    ServiceClass service 
    IDynamoDBMapper mapper 

    def setup() { 
     service = Mock(ServiceClass) 
     mapper = Mock(IDynamoDBMapper) 
     eventsResource = new ResourceClass(service, mapper) 
    } 
} 

со вторым решением, которое вы получите больший контроль над тестировать класс ресурсов, но первое решение должно быть проще

+0

Спасибо Gergely. Я изменил исходный код, чтобы ввести DynamoDBMapper в класс ресурсов. Это происходит только при использовании Spock или с mockito? – vamsi

+0

Это происходит при запуске тестов Spock, но это не проблема с нажатием кнопки, но при запуске приложения и при запуске тестов путь к классам обычно отличается. Поэтому, если у вас есть файл конфигурации динамо-db в пути к классам при запуске приложения, но не при выполнении тестов –

1

Либо вам нужно как-то издеваться над вашим DefaultDynamoDBClientFactory.mapperClient() или сделать его инъекционным, иначе он будет искать настоящую инстанцию ​​и сработает.

public class ResourceClass { 
    private IDynamoDBMapper factory; 
    private ServiceClass service; 

    @Inject 
    public ResourceClass(IDynamoDBMapper factory, ServiceClass service) { 
     this.factory = factory; 
     this.service = service; 
    } 
} 

Тогда вы должны быть в состоянии проверить свои единицы resourceClass в фантазии, как ниже,

class ResourceClassSpec extends Specification { 
    ResourceClass eventsResource 

    def setup() { 
     eventsResource = new ResourceClass(factory: Mock(IDynamoDBMapper), service: Mock(ServiceClass)) 
    } 

    def 'test does something'() { 
     given: 'given x' 
      // 
     when: 'when you call some method of resourceClass' 
      // 
     then: 'what you expect' 
      // 
      1 == 2 
    } 
} 
Смежные вопросы