Spring 3.1 and MVC Testing Support
-
Upload
sam-brannen -
Category
Technology
-
view
11.073 -
download
5
description
Transcript of Spring 3.1 and MVC Testing Support
![Page 1: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/1.jpg)
Spring 3.1 and MVCTesting Support
Sam BrannenSwiftmind
Rossen StoyanchevSpringSource, VMware
SpringOne 2GXOctober 28, 2011
![Page 2: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/2.jpg)
Sam BrannenSenior Software Consultant @ Swiftmind
Java developer with 13+ years' experience
Spring Framework Core Developer
Lead author of Spring in a Nutshell
Previous SpringSource dm Server™ developer
Presenter on Spring, Java, OSGi, and testing
![Page 3: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/3.jpg)
Rossen StoyanchevStaff Engineer SpringSource, VMware
Spring MVC, Spring Web Flow committer
Teach and consult, Spring Projects
Spring Web course author
NYC area
![Page 4: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/4.jpg)
Goals of thePresentation
Gain an overview of testing featuresin Spring 3.1
Learn about the new Spring MVCTest Support project
![Page 5: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/5.jpg)
AgendaSpring TestContext Framework
Testing with @Configuration Classes
Testing with Environment Profiles
Spring MVC Test Support
Q&A
![Page 6: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/6.jpg)
Show of Hands...JUnit / TestNG
Spring 2.5 / 3.0 / 3.1
Integration testing with Spring
Spring TestContext Framework
Spring MVC
Spring MVC Test Support
![Page 7: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/7.jpg)
Spring TestContextFramework
![Page 8: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/8.jpg)
Introduced in Spring 2.5
![Page 9: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/9.jpg)
Revised in Spring 3.1
![Page 10: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/10.jpg)
Unit and integration testing
![Page 11: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/11.jpg)
Annotation-driven
![Page 12: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/12.jpg)
Convention over Configuration
![Page 13: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/13.jpg)
JUnit & TestNG
![Page 14: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/14.jpg)
Spring & Unit TestingPOJO-based programming model
Program to interfaces
IoC / Dependency Injection
Out-of-container testability
Testing mocks/stubs for various APIs: Servlet,Portlet, JNDI
General purpose testing utilitiesReflectionTestUtilsModelAndViewAssert
![Page 15: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/15.jpg)
Spring & Integration TestingApplicationContext management & caching
Dependency injection of test instances
Transactional test managementwith default rollback semantics
SimpleJdbcTestUtils
JUnit 3.8 support classes are deprecated as ofSpring 3.0/3.1
![Page 16: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/16.jpg)
Spring Test AnnotationsApplication Contexts
@ContextConfiguration, @DirtiesContext
@TestExecutionListeners
Dependency Injection@Autowired, @Qualifier, @Inject, …
Transactions@Transactional, @TransactionConfiguration, @Rollback,@BeforeTransaction, @AfterTransaction
![Page 17: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/17.jpg)
Spring JUnit AnnotationsTesting Profiles
groups, not bean definitionprofiles@IfProfileValue,@ProfileValueSourceConfiguration
JUnit extensions@Timed, @Repeat
![Page 18: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/18.jpg)
Using the TestContextFramework
Use the SpringJUnit4ClassRunner forJUnit 4.5+
Instrument test class withTestContextManager for TestNG
Extend one of the base classesAbstract(Transactional)[JUnit4|TestNG]SpringContextTests
![Page 19: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/19.jpg)
Example: @POJO Test Class
public class OrderServiceTests {
@Test public void testOrderService() { … }}
![Page 20: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/20.jpg)
Example: @POJO Test Class@RunWith(SpringJUnit4ClassRunner.class)
public class OrderServiceTests {
@Test public void testOrderService() { … }}
![Page 21: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/21.jpg)
Example: @POJO Test Class@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration
public class OrderServiceTests {
@Test public void testOrderService() { … }}
![Page 22: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/22.jpg)
Example: @POJO Test Class@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration // defaults to// OrderServiceTests-context.xml in same packagepublic class OrderServiceTests {
@Test public void testOrderService() { … }}
![Page 23: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/23.jpg)
Example: @POJO Test Class@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration // defaults to// OrderServiceTests-context.xml in same packagepublic class OrderServiceTests { @Autowired private OrderService orderService;
@Test public void testOrderService() { … }}
![Page 24: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/24.jpg)
Example: @POJO Test Class@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration // defaults to// OrderServiceTests-context.xml in same package@Transactionalpublic class OrderServiceTests { @Autowired private OrderService orderService;
@Test public void testOrderService() { … }}
![Page 25: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/25.jpg)
Example: @POJO Test Class@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration // defaults to// OrderServiceTests-context.xml in same package@Transactionalpublic class OrderServiceTests { @Autowired private OrderService orderService; @BeforeTransaction public void verifyInitialDatabaseState() { … }
@Test public void testOrderService() { … }}
![Page 26: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/26.jpg)
Example: @POJO Test Class@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration // defaults to// OrderServiceTests-context.xml in same package@Transactionalpublic class OrderServiceTests { @Autowired private OrderService orderService; @BeforeTransaction public void verifyInitialDatabaseState() { … } @Before public void setUpTestDataWithinTransaction() { … } @Test public void testOrderService() { … }}
![Page 27: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/27.jpg)
Core Components
![Page 28: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/28.jpg)
TestContextTracks context for current test
Delegates to a ContextLoader
Caches ApplicationContext
![Page 29: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/29.jpg)
TestContextManagerManages the TestContext
Signals events to listeners:before: before-class methodsafter: test instantiationbefore: before methodsafter: after methodsafter: after-class methods
![Page 30: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/30.jpg)
TestExecutionListener SPIReacts to test execution events
Receives reference to current TestContext
Out of the box:DependencyInjectionTestExecutionListenerDirtiesContextTestExecutionListenerTransactionalTestExecutionListener
![Page 31: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/31.jpg)
TestExecutionListener
![Page 32: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/32.jpg)
TEL: Prepare Instance
![Page 33: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/33.jpg)
TEL: Befores and Afters
![Page 34: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/34.jpg)
ContextLoader SPIStrategy for loading application contexts
from resource locations
Out of the box:GenericXmlContextLoaderGenericPropertiesContextLoader
![Page 35: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/35.jpg)
ContextLoader 2.5
![Page 36: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/36.jpg)
Putting it all together
![Page 37: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/37.jpg)
New in Spring 3.1
![Page 38: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/38.jpg)
Support for ...
![Page 39: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/39.jpg)
testing with @Configuration classes
![Page 40: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/40.jpg)
and
![Page 41: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/41.jpg)
testing with environment profiles
![Page 42: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/42.jpg)
made possible by ...
![Page 43: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/43.jpg)
SmartContextLoader
![Page 44: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/44.jpg)
AnnotationConfigContextLoader
![Page 45: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/45.jpg)
DelegatingSmartContextLoader
![Page 46: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/46.jpg)
updated context cache key generation
![Page 47: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/47.jpg)
SmartContextLoader SPISupersedes ContextLoader
Strategy for loading applicationcontexts
From @Configuration classes orresource locations
Supports environment profiles
![Page 48: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/48.jpg)
ImplementationsGenericXmlContextLoader
GenericPropertiesContextLoader
AnnotationConfigContextLoader
DelegatingSmartContextLoader
![Page 49: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/49.jpg)
ContextLoader 2.5
![Page 50: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/50.jpg)
ContextLoader 3.1
![Page 51: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/51.jpg)
Testing with@Configuration Classes
![Page 52: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/52.jpg)
@ContextConfigurationaccepts a new classes attribute...
![Page 53: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/53.jpg)
@ContextConfiguration( classes={DataAccessConfig.class, ServiceConfig.class})
![Page 54: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/54.jpg)
First, a review with XML config forcomparison...
![Page 55: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/55.jpg)
OrderServiceTest-context.xml
<?xml version="1.0" encoding="UTF-8"?><beans ...> <!-- will be injected into OrderServiceTest --> <bean id="orderService" class="com.example.OrderServiceImpl"> <!-- set properties, etc. --> </bean> <!-- other beans --></beans>
![Page 56: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/56.jpg)
OrderServiceTest.java
package com.example;@RunWith(SpringJUnit4ClassRunner.class)@ContextConfigurationpublic class OrderServiceTest { @Autowired private OrderService orderService; @Test public void testOrderService() { // test the orderService }}
![Page 57: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/57.jpg)
Let's rework that example to use a@Configuration class and the newAnnotationConfigContextLoader...
![Page 58: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/58.jpg)
OrderServiceTest.java
@RunWith(SpringJUnit4ClassRunner.class)
public class OrderServiceTest {
@Autowired private OrderService orderService; // @Test methods ...}
![Page 59: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/59.jpg)
OrderServiceTest.java
@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration( loader=AnnotationConfigContextLoader.class)public class OrderServiceTest {
@Autowired private OrderService orderService; // @Test methods ...}
![Page 60: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/60.jpg)
OrderServiceTest.java
@RunWith(SpringJUnit4ClassRunner.class)@ContextConfigurationpublic class OrderServiceTest {
@Autowired private OrderService orderService; // @Test methods ...}
![Page 61: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/61.jpg)
OrderServiceTest.java
@RunWith(SpringJUnit4ClassRunner.class)@ContextConfigurationpublic class OrderServiceTest { @Configuration static class Config {
} @Autowired private OrderService orderService; // @Test methods ...}
![Page 62: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/62.jpg)
OrderServiceTest.java
@RunWith(SpringJUnit4ClassRunner.class)@ContextConfigurationpublic class OrderServiceTest { @Configuration static class Config { @Bean // will be injected into OrderServiceTest public OrderService orderService() { OrderService orderService = new OrderServiceImpl(); // set properties, etc. return orderService; } } @Autowired private OrderService orderService; // @Test methods ...}
![Page 63: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/63.jpg)
What's changed?No XML
Bean definitions are converted toJava
using @Configuration and @Bean
Otherwise, the test remainsunchanged
![Page 64: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/64.jpg)
But what if we don't want a staticinner @Configuration class?
![Page 65: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/65.jpg)
Just externalize the config...
![Page 66: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/66.jpg)
OrderServiceConfig.java
@Configurationpublic class OrderServiceConfig { @Bean // will be injected into OrderServiceTest public OrderService orderService() { OrderService orderService = new OrderServiceImpl(); // set properties, etc. return orderService; }}
![Page 67: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/67.jpg)
And reference the config classes in@ContextConfiguration...
![Page 68: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/68.jpg)
OrderServiceConfig.java
@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration(classes=OrderServiceConfig.class)public class OrderServiceTest { @Autowired private OrderService orderService; @Test public void testOrderService() { // test the orderService }}
![Page 69: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/69.jpg)
@Configuration + XMLQ: How can we combine@Configuration classes with XMLconfig?
A: Choose one as the entry point.
That's how it works in productionanyway
![Page 70: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/70.jpg)
Importing ConfigurationIn XML:
include @Configuration classes viacomponent scanningor define them as normal Springbeans
In an @Configuration class:use @ImportResource to import XMLconfig files
![Page 71: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/71.jpg)
Testing withEnvironment Profiles
![Page 72: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/72.jpg)
@ActiveProfilesTo activate bean definition profiles in tests...
Annotate a test class with@ActiveProfiles
Supply a list of profiles to beactivated for the test
Can be used with @Configurationclasses and XML config
![Page 73: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/73.jpg)
Let's look at an example with XMLconfig...
![Page 74: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/74.jpg)
app-config.xml (1/2)
<beans ... > <bean id="transferService" class="com.example.DefaultTransferService"> <constructor-arg ref="accountRepository"/> <constructor-arg ref="feePolicy"/> </bean> <bean id="accountRepository" class="com.example.JdbcAccountRepository"> <constructor-arg ref="dataSource"/> </bean> <bean id="feePolicy" class="com.example.ZeroFeePolicy"/> <!-- dataSource --></beans>
![Page 75: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/75.jpg)
app-config.xml (2/2)
<beans ... > <!-- transferService, accountRepository, feePolicy -->
</beans>
![Page 76: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/76.jpg)
app-config.xml (2/2)
<beans ... > <!-- transferService, accountRepository, feePolicy --> <beans profile="production"> <jee:jndi-lookup id="dataSource" jndi-name="java:comp/env/jdbc/datasource"/> </beans>
</beans>
![Page 77: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/77.jpg)
app-config.xml (2/2)
<beans ... > <!-- transferService, accountRepository, feePolicy --> <beans profile="production"> <jee:jndi-lookup id="dataSource" jndi-name="java:comp/env/jdbc/datasource"/> </beans> <beans profile="dev"> <jdbc:embedded-database id="dataSource"> <jdbc:script location="classpath:schema.sql"/> <jdbc:script location="classpath:test-data.sql"/> </jdbc:embedded-database> </beans></beans>
![Page 78: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/78.jpg)
TransferServiceTest.java
@RunWith(SpringJUnit4ClassRunner.class)
public class TransferServiceTest { @Autowired private TransferService transferService; @Test public void testTransferService() { // test the transferService }}
![Page 79: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/79.jpg)
TransferServiceTest.java
@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration("/app-config.xml")public class TransferServiceTest { @Autowired private TransferService transferService; @Test public void testTransferService() { // test the transferService }}
![Page 80: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/80.jpg)
TransferServiceTest.java
@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration("/app-config.xml")@ActiveProfiles("dev")public class TransferServiceTest { @Autowired private TransferService transferService; @Test public void testTransferService() { // test the transferService }}
![Page 81: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/81.jpg)
And now an example with@Configuration classes
![Page 82: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/82.jpg)
TransferServiceConfig.java
@Configurationpublic class TransferServiceConfig { @Autowired DataSource dataSource; @Bean public TransferService transferService() { return new DefaultTransferService(accountRepository(), feePolicy()); } @Bean public AccountRepository accountRepository() { return new JdbcAccountRepository(dataSource); } @Bean public FeePolicy feePolicy() { return new ZeroFeePolicy(); }}
![Page 83: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/83.jpg)
}
JndiDataConfig.java
@Configuration@Profile("production")public class JndiDataConfig { @Bean public DataSource dataSource() throws Exception { Context ctx = new InitialContext(); return (DataSource) ctx.lookup("java:comp/env/jdbc/datasource"); }}
![Page 84: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/84.jpg)
StandaloneDataConfig.java
@Configuration@Profile("dev")public class StandaloneDataConfig { @Bean public DataSource dataSource() { return new EmbeddedDatabaseBuilder() .setType(EmbeddedDatabaseType.HSQL) .addScript("classpath:schema.sql") .addScript("classpath:test-data.sql") .build(); }}
![Page 85: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/85.jpg)
And finally the test class...
![Page 86: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/86.jpg)
TransferServiceTest.java
package com.bank.service;@RunWith(SpringJUnit4ClassRunner.class)
public class TransferServiceTest { @Autowired private TransferService transferService; @Test public void testTransferService() { // test the transferService }}
![Page 87: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/87.jpg)
TransferServiceTest.java
package com.bank.service;@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration( classes={ TransferServiceConfig.class, StandaloneDataConfig.class, JndiDataConfig.class})public class TransferServiceTest { @Autowired private TransferService transferService; @Test public void testTransferService() { // test the transferService }}
![Page 88: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/88.jpg)
TransferServiceTest.java
package com.bank.service;@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration( classes={ TransferServiceConfig.class, StandaloneDataConfig.class, JndiDataConfig.class})@ActiveProfiles("dev")public class TransferServiceTest { @Autowired private TransferService transferService; @Test public void testTransferService() { // test the transferService }}
![Page 89: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/89.jpg)
Active Profile Inheritance@ActiveProfiles supports inheritance as well
Via the inheritProfiles attribute
See Javadoc for an example
![Page 90: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/90.jpg)
ApplicationContextCaching
![Page 91: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/91.jpg)
Until Spring 3.1
![Page 92: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/92.jpg)
application contexts were cached
![Page 93: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/93.jpg)
but using only resource locations forthe key.
![Page 94: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/94.jpg)
Now there are differentrequirements...
![Page 95: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/95.jpg)
New Key Generation AlgorithmThe context cache key generation algorithm has been updated to include...
locations (from @ContextConfiguration)
classes (from @ContextConfiguration)
contextLoader (from @ContextConfiguration)
activeProfiles (from @ActiveProfiles)
![Page 96: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/96.jpg)
SummaryThe Spring TestContext Framework simplifiesintegration testing of Spring-basedapplications
Spring 3.1 provides first-class testing supportfor:
@Configuration classesEnvironment profiles
See the Testing with @Configuration Classesand Profiles blog for further insight
![Page 97: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/97.jpg)
Spring MVC TestSupport
![Page 98: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/98.jpg)
How Do You Test an@Controller?
![Page 99: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/99.jpg)
@Controller@RequestMapping("/accounts")public class AccountController { // ... @ModelAttribute public Account getAccount(String number) { return this.accountManager.getAccount(number); } @RequestMapping(method = RequestMethod.POST) public String save(@Valid Account account, BindingResult result) { if (result.hasErrors()) { return "accounts/edit"; } this.accountManager.saveOrUpdate(account); return "redirect:accounts"; }}
![Page 100: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/100.jpg)
Unit Test?Create controller instance
Mock or stub services & repositories
![Page 101: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/101.jpg)
Example@Testpublic void testSave() { Account account = new Account(); BindingResult result = new BeanPropertyBindingResult(account, "account");
}
![Page 102: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/102.jpg)
Example@Testpublic void testSave() { Account account = new Account(); BindingResult result = new BeanPropertyBindingResult(account, "account"); AccountManager mgr = createMock(AccountManager.class); mgr.saveOrUpdate(account); replay(mgr);
}
![Page 103: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/103.jpg)
Example@Testpublic void testSave() { Account account = new Account(); BindingResult result = new BeanPropertyBindingResult(account, "account"); AccountManager mgr = createMock(AccountManager.class); mgr.saveOrUpdate(account); replay(mgr); AccountController contrlr = new AccountController(mgr); String view = contrlr.save(account, result);
}
![Page 104: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/104.jpg)
Example@Testpublic void testSave() { Account account = new Account(); BindingResult result = new BeanPropertyBindingResult(account, "account"); AccountManager mgr = createMock(AccountManager.class); mgr.saveOrUpdate(account); replay(mgr); AccountController contrlr = new AccountController(mgr); String view = contrlr.save(account, result); assertEquals("redirect:accounts", view); verify(mgr);}
![Page 105: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/105.jpg)
Example With Failure@Testpublic void testSave() { Account account = new Account(); BindingResult result = new BeanPropertyBindingResult(account, "account"); result.reject("error.code", "default message")
}
![Page 106: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/106.jpg)
Example With Failure@Testpublic void testSave() { Account account = new Account(); BindingResult result = new BeanPropertyBindingResult(account, "account"); result.reject("error.code", "default message") AccountManager mgr = createMock(AccountManager.class); replay(mgr);
}
![Page 107: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/107.jpg)
Example With Failure@Testpublic void testSave() { Account account = new Account(); BindingResult result = new BeanPropertyBindingResult(account, "account"); result.reject("error.code", "default message") AccountManager mgr = createMock(AccountManager.class); replay(mgr); AccountController contrlr = new AccountController(mgr); String view = contrlr.save(account, result); assertEquals("accounts/edit", view); verify(mgr);}
![Page 108: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/108.jpg)
Not Fully TestedRequest mappings
Binding errors
Type conversion
Etc.
![Page 109: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/109.jpg)
Integration Test?Selenium
JWebUnit
etc.
![Page 110: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/110.jpg)
It Requires...A running servlet container
More time to execute
More effort to maintain
Server is a black box
![Page 111: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/111.jpg)
Actually...
![Page 112: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/112.jpg)
it's an end-to-end test
![Page 113: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/113.jpg)
the only way to verify...Client-side behavior
Interaction with other server instances
Redis, Rabbit, etc.
![Page 114: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/114.jpg)
We'd also like to...Test controllers once!
Fully & quickly
Execute tests often
![Page 115: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/115.jpg)
In summary...We can't replace the need for end-to-
end tests
But we can minimize errors
Have confidence in @MVC code
During end-to-end tests
![Page 116: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/116.jpg)
Spring MVC TestBuilt on spring-test
No Servlet container
Drives Spring MVC infrastructure
Both server & client-side test support (i.e. RestTemplate code)
Inspired by spring-ws-test
![Page 117: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/117.jpg)
The ApproachRe-use controller test fixtures
I.e. mocked services & repositories
Invoke @Controller classes through@MVC infrastructure
![Page 118: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/118.jpg)
ExampleString contextLoc = "classpath:appContext.xml";String warDir = "src/main/webapp";MockMvc mockMvc = xmlConfigSetup(contextLoc) .configureWebAppRootDir(warDir, false) .build();mockMvc.perform(post("/persons")) .andExpect(response().status().isOk()) .andExpect(response().forwardedUrl("/add.jsp")) .andExpect(model().size(1)) .andExpect(model().hasAttributes("person"));
![Page 119: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/119.jpg)
Under the CoversMock request/response from spring-test
DispatcherServlet replacement
Multiple ways to initialize MVCinfrastructure
Save results for expectations
![Page 120: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/120.jpg)
Ways To Initialize MVCInfrastructure
![Page 121: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/121.jpg)
From Existing XML Config// XML configMockMvc mockMvc = xmlConfigSetup("classpath:appContext.xml") .activateProfiles(..) .configureWebAppRootDir(warDir, false) .build();
![Page 122: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/122.jpg)
From Existing Java Config// Java configMockMvc mockMvc = annotationConfigSetup(WebConfig.class) .activateProfiles(..) .configureWebAppRootDir(warDir, false) .build();
![Page 123: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/123.jpg)
Manually MockMvc mockMvc = standaloneSetup(new PersonController()) .setMessageConverters(..) .setValidator(..) .setConversionService(..) .addInterceptors(..) .setViewResolvers(..) .setLocaleResolver(..) .build();
![Page 124: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/124.jpg)
About Manual SetupMVC components instantiated directly
Not looked up in Spring context
Focused, readable tests
But must verify MVC config separately
![Page 125: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/125.jpg)
TestContext Framework Example@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration( locations={"/org/example/servlet-context.xml"})public class TestContextTests { @Autowired private WebApplicationContext wac; @Before public void setup() { MockMvc mockMvc = MockMvcBuilders.webApplicationContextSetup(this.wac) .build(); }}
![Page 126: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/126.jpg)
TestContext FrameworkCaches loaded Spring configuration
Potentially across all tests!
![Page 127: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/127.jpg)
However...WebApplicationContext not supported yet
To be supported in Spring 3.2
![Page 128: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/128.jpg)
In the mean time...You can use a custom ContextLoader
Example exists in spring-test-mvc
![Page 129: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/129.jpg)
Step 1Add static imports
MockMvcBuilders.*
MockMvcRequestBuilders.*
MockMvcResultActions.*
![Page 130: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/130.jpg)
Easy to remember...MockMvc*
![Page 131: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/131.jpg)
Also in Eclipse...Add MockMvc* classes in Preferences
Java -> Editor -> Favorites
Helps content assist
![Page 132: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/132.jpg)
Step 2Initialize MVC infrastructure
String contextLoc = "classpath:appContext.xml";String warDir = "src/main/webapp";MockMvc mockMvc = xmlConfigSetup("classpath:appContext.xml") .configureWebAppRootDir(warDir, false) .build()
// ...
![Page 133: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/133.jpg)
Step 3Build Request
String contextLoc = "classpath:appContext.xml";String warDir = "src/main/webapp";MockMvc mockMvc = xmlConfigSetup("classpath:appContext.xml") .configureWebAppRootDir(warDir, false) .build()mockMvc.perform(get("/").accept(MediaType.APPLICATION_XML))
// ...
![Page 134: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/134.jpg)
Step 4Add Expectations
String contextLoc = "classpath:appContext.xml";String warDir = "src/main/webapp";MockMvc mockMvc = xmlConfigSetup("classpath:appContext.xml") .configureWebAppRootDir(warDir, false) .build()mockMvc.perform(get("/").accept(MediaType.APPLICATION_XML)) .andExpect(response().status().isOk()) .andExpect(response().contentType(MediaType)) .andExpect(response().content().xpath(String).exists()) .andExpect(response().redirectedUrl(String)) .andExpect(model().hasAttributes(String...));
// ...
![Page 135: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/135.jpg)
Step 5Debug
String contextLoc = "classpath:appContext.xml";String warDir = "src/main/webapp";MockMvc mockMvc = xmlConfigSetup("classpath:appContext.xml") .configureWebAppRootDir(warDir, false) .build()mockMvc.perform(get("/").accept(MediaType.APPLICATION_XML)) .andPrint(toConsole());
// ...
![Page 136: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/136.jpg)
Demo
https://github.com/SpringSource/spring-test-mvc
Sample Tests:
org.springframework.test.web.server.samples
![Page 137: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/137.jpg)
Client-Side ExampleRestTemplate restTemplate = ... ;MockRestServiceServer.createServer(restTemplate) .expect(requestTo(String)) .andExpect(method(HttpMethod)) .andExpect(body(String)) .andExpect(headerContains(String, String)) .andRespond(withResponse(String, HttpHeaders));
![Page 138: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/138.jpg)
Project Availabilitygithub.com/SpringSource/spring-test-mvc
Request for feedback!
Send comments
Pull requests
![Page 139: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/139.jpg)
Nightly Snapshot Available<repository> <id>org.springframework.maven.snapshot</id> <name>Spring Maven Snapshot Repository</name> <url>http://maven.springframework.org/snapshot</url> <releases> <enabled>false</enabled> </releases> <snapshots> <enabled>true</enabled> </snapshots></repository>
![Page 140: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/140.jpg)
In Closing ...
![Page 141: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/141.jpg)
This PresentationSource:https://github.com/rstoyanchev/spring-31-and-mvc-testing-support
Slides:http://rstoyanchev.github.com/spring-31-and-mvc-test
![Page 142: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/142.jpg)
Resources for Spring MVC TestProject Home:https://github.com/SpringSource/spring-test-mvc
Sample Tests:org.springframework.test.web.server.samples
![Page 143: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/143.jpg)
Resources for Core SpringSpring Framework:http://www.springsource.org/spring-core
Reference Manual: Spring 3.1 RC1
Forums: http://forum.springframework.org
JIRA: https://jira.springsource.org
Spring in a Nutshell … available in 2012
![Page 144: Spring 3.1 and MVC Testing Support](https://reader034.fdocuments.net/reader034/viewer/2022052310/554f5c15b4c905c8088b46e9/html5/thumbnails/144.jpg)
Q&A
Sam BrannenWeb: Swiftmind.com
Twitter: @sam_brannen
Rossen StoyanchevWeb: SpringSource.com
Twitter: @rstoya05