Skip to content

Commit

Permalink
enhance spock.xsd to support creation on a bean reference for partiy
Browse files Browse the repository at this point in the history
with DetachedMockFactory
  • Loading branch information
Taylor Wicksell committed Mar 21, 2017
1 parent 7e5acd1 commit 8c8ea9f
Show file tree
Hide file tree
Showing 6 changed files with 82 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -16,5 +16,6 @@ public void init() {
registerBeanDefinitionParser("mock", new MockBeanDefinitionParser());
registerBeanDefinitionParser("spy", new MockBeanDefinitionParser());
registerBeanDefinitionParser("stub", new MockBeanDefinitionParser());
registerBeanDefinitionParser("wrapWithSpy", new WrapWithSpyBeanDefinitionParser());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package org.spockframework.spring.xml;

import java.util.Collections;

import org.spockframework.mock.MockNature;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;

import spock.mock.DetachedMockFactory;

public class SpockSpyBeanPostProcessor implements BeanPostProcessor {

private final String beanName;

public SpockSpyBeanPostProcessor(String beanName) {
this.beanName = beanName;
}

@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
return bean;
}

@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
if (this.beanName.equals(beanName)) {
return new DetachedMockFactory().createMock(beanName, bean, MockNature.SPY,
Collections.<String, Object>emptyMap());
} else {
return bean;
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package org.spockframework.spring.xml;

import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.xml.AbstractSingleBeanDefinitionParser;
import org.w3c.dom.Element;

public class WrapWithSpyBeanDefinitionParser extends AbstractSingleBeanDefinitionParser {

@Override
protected Class<?> getBeanClass(Element element) {
return SpockSpyBeanPostProcessor.class;
}

@Override
protected void doParse(Element element, BeanDefinitionBuilder builder) {
builder.addConstructorArgValue(element.getAttribute("ref"));
}

@Override
protected boolean shouldGenerateIdAsFallback() {
return true;
}
}
11 changes: 11 additions & 0 deletions spock-spring/src/main/resources/org/spockframework/spock.xsd
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,18 @@
</xs:complexContent>
</xs:complexType>

<xs:complexType name="wrapWithSpyDefinitionType">
<xs:attribute name="ref" type="xs:string" use="required">
<xs:annotation>
<xs:documentation>
<![CDATA[ The bean id that you would like to wrap with a spy. ]]>
</xs:documentation>
</xs:annotation>
</xs:attribute>
</xs:complexType>

<xs:element name="mock" type="spock:mockDefinitionType"/>
<xs:element name="spy" type="spock:mockDefinitionType"/>
<xs:element name="stub" type="spock:mockDefinitionType"/>
<xs:element name="wrapWithSpy" type="wrapWithSpyDefinitionType"/>
</xs:schema>
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,10 @@ public class MockInjectionExample extends Specification {

@Autowired @Named('service2')
IService2 service2


@Autowired @Named('nonMock')
ArrayList concreteSpy;

def "Injected services are mocks"() {
expect:
new MockUtil().isMock(serviceMock)
Expand Down Expand Up @@ -56,5 +59,13 @@ public class MockInjectionExample extends Specification {
service2.generateQuickBrownFox() == null

}

def "Spies can be created from concrete objects and injected"() {
when:
concreteSpy.size()

then:
1 * concreteSpy.size() >> 0
}

}
3 changes: 2 additions & 1 deletion spock-spring/src/test/resources/MockExamples-context.xml
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,13 @@
<spock:mock id="serviceMock" class="org.spockframework.spring.IService1"/>
<spock:stub id="serviceStub" class="org.spockframework.spring.IService1"/>
<spock:spy id="serviceSpy" class="org.spockframework.spring.Service2"/>

<spock:wrapWithSpy ref="nonMock"/>

<bean id="service2" class="org.spockframework.spring.xml.SpockMockFactoryBean">
<constructor-arg value="org.spockframework.spring.IService2"/>
</bean>

<bean id="nonMock" class="java.util.ArrayList"/>

<bean id="abstractBean" class="java.util.ArrayList" abstract="true"/>
</beans>

0 comments on commit 8c8ea9f

Please sign in to comment.