рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдг рдПрдХ рдЕрдЪреНрдЫреА рдмрд╛рдд рд╣реИ, рд▓реЗрдХрд┐рди, рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдЖрдк рдХреЗрд╡рд▓ рдЙрди рдкрд░ рднрд░реЛрд╕рд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рдХрднреА-рдХрднреА рдпрд╣ рдЬрд╛рдВрдЪрдирд╛ рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдХрд┐рддрдиреА рдХрдХреНрд╖рд╛рдПрдБ рдХрд╛рдо рдХрд░рддреА рд╣реИрдВ, рдФрд░ рдХрднреА-рдХрднреА рдПрдХ рд╕рд╛рде рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдкрд░рддреЗрдВред
рд╣рдорд╛рд░рд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рд╕реНрдкреНрд░рд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдРрд╕реЗ рдПрдХреАрдХрд░рдг рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рд╡рд╕рдВрдд рд╕рдВрджрд░реНрдн рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЕрдХреНрд╕рд░, рдРрд╕реЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рдмрд╣реБрдд рд╕рдордп рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рдЖрдк рдЗрди-рдореЗрдореЛрд░реА рдбреЗрдЯрд╛рдмреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ (рд╡реИрд╕реЗ, рдореИрдВрдиреЗ рдЬрд╛рдБрдЪ рдХреА рдХрд┐ рдХреНрдпреЛрдВ - рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкреНрд░рддреНрдпреЗрдХ рдФрд░ рд╣рд╛рдЗрдмрд░рдиреЗрдЯ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдореЗрдВ рдХрдИ рдЧреБрдгреЛрдВ рдХреЗ рд╕рд╛рде рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЬреЗрдкреАрдП рдЗрдХрд╛рдЗрдпрд╛рдБ рд╣реИрдВ, рдпрд╣ рджрд╕рд┐рдпреЛрдВ рд╕реЗрдХрдВрдб рд▓реЗрддрд╛ рд╣реИ!)
рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдЗрди рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд╡рд┐рдкрд░реАрдд, рдирд┐рд░реНрдорд╛рдг рдХреЗ рджреМрд░рд╛рди рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рддреЛ рдпреЛрдЬрдирд╛ рдпрд╣ рд╣реИ:
1. рд╣рдо рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рджреЛ рдкрд░рддреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рд╕реЗрд╡рд╛рдУрдВ рдХреЛ рд▓рд┐рдЦрддреЗ рд╣реИрдВ
2. рдЙрдиреНрд╣реЗрдВ рд╡рд╕рдВрдд рдХреЗ рд╕рд╛рде рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ
3. рд╣рдо рдЗрди рд╕реЗрд╡рд╛рдУрдВ рдХреА рдмрд╛рддрдЪреАрдд рдХреЗ рд▓рд┐рдП JUnit рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦреЗрдВрдЧреЗ (рд╡рд╛рд╕реНрддрд╡рд┐рдХ, рдмрд┐рдирд╛ рдХрд┐рд╕реА рдирдХрд▓реА)
4. рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдпрд╣ рдкрд░реАрдХреНрд╖рдг рдмрд┐рд▓реНрдб рдХреЗ рджреМрд░рд╛рди рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдирд╣реАрдВ рдЪрд▓рддрд╛ рд╣реИ
5. рд▓рд╛рдн!
1. рд╣рдо рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рджреЛ рдкрд░рддреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рд╕реЗрд╡рд╛рдУрдВ рдХреЛ рд▓рд┐рдЦрддреЗ рд╣реИрдВ
рджреЛ рдкрд░рддреЗрдВ рдХреНрдпреЛрдВ? рдореИрдВ рд╡реНрдпрд╛рдкрд╛рд░ рддрд░реНрдХ рдХреЛ рдкрд░рддреЛрдВ рдореЗрдВ рддреЛрдбрд╝рдирд╛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рджреГрдврд╝рддрд╛ рдкрд░рдд) рддрд╛рдХрд┐ рдХреЛрдб рд╕реНрдкреЗрдЧреЗрдЯреА рдореЗрдВ рдмрджрд▓ рди рдЬрд╛рдПред рдкрд░рддреЛрдВ рдореЗрдВ рдПрдХ рдкрджрд╛рдиреБрдХреНрд░рдо рд╣реИ - рдЬреЛ рдХрд┐рд╕реЗ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдкрд░рддреЛрдВ рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдорд╛рд╡реЗрди рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдЕрд▓рдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдореИрдВ рдЬрд╛рдВрдЪрддрд╛ рд╣реВрдВ рдХрд┐ рдХреЛрдИ рдирд┐рд╖рд┐рджреНрдз рдирд┐рд░реНрднрд░рддрд╛ рдирд╣реАрдВ рд╣реИред
рддреЛ, рд╣рдо рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рд╕рд╛рде рдкреВрд░реЗ рдЖрд╡реЗрджрди рдХреЗ pom.xml рдмрдирд╛рддреЗ рд╣реИрдВ рдЬреЛ рд╕рднреА рдХреЛ рдЪрд╛рд╣рд┐рдП:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.mycompany</groupId> <artifactId>myapp</artifactId> <version>1.0-SNAPSHOT</version> <packaging>pom</packaging> <name>myapp</name> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <spring-version>3.1.0.RELEASE</spring-version> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.8.2</version> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>${spring-version}</version> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>${spring-version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring-version}</version> </dependency> </dependencies> <modules> <module>backend</module> <module>frontend</module> <module>gui</module> </modules> </project>
рдЗрд╕рдХреЗ рддреАрди рдореЙрдбреНрдпреВрд▓ рд╣реИрдВ - рдЧреБрдИ, рдлреНрд░рдВрдЯреЗрдВрдб рдФрд░ рдмреИрдХрдПрдВрдб (рдмрд┐рдЬрдиреЗрд╕ рд▓реЙрдЬрд┐рдХ рдХреА рджреЛ рдкрд░рддреЗрдВ)ред
рдпрд╣рд╛рдБ рджреГрд╢реНрдп рдХреЗ рд▓рд┐рдП pom.xml рд╣реИ:
<?xml version="1.0"?> <project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>com.mycompany</groupId> <artifactId>myapp</artifactId> <version>1.0-SNAPSHOT</version> </parent> <groupId>com.mycompany</groupId> <artifactId>frontend</artifactId> <version>1.0-SNAPSHOT</version> <name>frontend</name> <dependencies> <dependency> <groupId>com.mycompany</groupId> <artifactId>backend</artifactId> <version>1.0-SNAPSHOT</version> </dependency> </dependencies> </project>
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ рдмреИрдХрдПрдВрдб рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдЕрдкрдиреЗ рдкрд┐рддрд╛ рдХреЗ рдкреЛрдо рд╕реЗ рд╕рдм рдХреБрдЫ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред
рдпрд╣рд╛рдБ рдмреИрдХреЗрдВрдб рдХреЗ рд▓рд┐рдП pom.xml рд╣реИ:
<?xml version="1.0"?> <project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>com.mycompany</groupId> <artifactId>myapp</artifactId> <version>1.0-SNAPSHOT</version> </parent> <groupId>com.mycompany</groupId> <artifactId>backend</artifactId> <version>1.0-SNAPSHOT</version> <name>backend</name> </project>
рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдмреИрдХрдПрдВрдб / src / main / java / com / mycompany / рд╕реЗрд╡рд╛ / рдмреИрдХрдПрдВрдб рдореЗрдВ, рдмрдирд╛рдПрдБ:
IBackendService1.java:
package com.mycompany.service.backend; public interface IBackendService1 { String computeSecretString(); }
IBackendService2.java:
package com.mycompany.service.backend; public interface IBackendService2 { int computeSecretNumber(); }
BackendService1.java:
package com.mycompany.service.backend; public class BackendService1 implements IBackendService1 { @Override public String computeSecretString() { return "James Bond"; } }
BackendService2.java:
package com.mycompany.service.backend; public class BackendService2 implements IBackendService2 { @Override public int computeSecretNumber() { return 7; } }
рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рджреГрд╢реНрдпрдкрдЯрд▓ / src / main / java / com / mycompany / рд╕реЗрд╡рд╛ / рджреГрд╢реНрдпрдкрдЯрд▓ рдореЗрдВ, рдмрдирд╛рдПрдБ:
IFrontendService.java:
package com.mycompany.service.frontend; public interface IFrontendService { String getAgent(); }
FrontendService.java:
package com.mycompany.service.frontend; import com.mycompany.service.backend.*; public class FrontendService implements IFrontendService { private IBackendService1 backendService1; private IBackendService2 backendService2; public FrontendService(IBackendService1 backendService1, IBackendService2 backendService2) { this.backendService1 = backendService1; this.backendService2 = backendService2; } @Override public String getAgent() { return backendService1.computeSecretString()+backendService2.computeSecretNumber(); } }
2. рдЙрдиреНрд╣реЗрдВ рд╡рд╕рдВрдд рдХреЗ рд╕рд╛рде рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ
рдмреИрдХрдПрдВрдб / src / рдореБрдЦреНрдп / рд╕рдВрд╕рд╛рдзрди / рдмреИрдХрдПрдВрдб- beans.xml:
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd"> <bean id="names_provider" class="com.mycompany.service.backend.BackendService1"/> <bean id="secret_service" class="com.mycompany.service.backend.BackendService2"/> </beans>
рдлреНрд░рдВрдЯреЗрдВрдб / src / рдореБрдЦреНрдп / рд╕рдВрд╕рд╛рдзрди / рдлреНрд░рдВрдЯреЗрдВрдб- beans.xml:
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd "> <import resource="classpath:backend-beans.xml"/> <bean id="agent_service" class="com.mycompany.service.frontend.FrontendService"> <constructor-arg index="0" ref="names_provider"/> <constructor-arg index="1" ref="secret_service"/> </bean> </beans>
3. рд╣рдо рдЗрди рд╕реЗрд╡рд╛рдУрдВ рдХреА рдмрд╛рддрдЪреАрдд рдХреЗ рд▓рд┐рдП JUnit рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦреЗрдВрдЧреЗ (рдЕрд╕рд▓реА, рдмрд┐рдирд╛ рдХрд┐рд╕реА рдирдХрд▓реА)
рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рджреГрд╢реНрдпрдкрдЯрд▓ / src / рдкрд░реАрдХреНрд╖рдг / рдЬрд╛рд╡рд╛ / рдХреЙрдо / mycompany / рдПрдХреАрдХрд░рдг
FrontendServiceTest.java:
package com.mycompany.integration; import com.mycompany.service.frontend.IFrontendService; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import static org.junit.Assert.assertTrue; @RunWith(SpringJUnit4ClassRunner.class) @DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD) @ContextConfiguration(locations = {"classpath:frontend-beans.xml"}) public class FrontendServiceTest { @Autowired IFrontendService frontendService; @Test public void testBond() { String agent = frontendService.getAgent(); assertTrue("It should be Bond", agent.contains("Bond")); } }
рдиреЛрдЯ рдиреЛрдЯ рдХрд░реЗрдВ:
@RunWith(SpringJUnit4ClassRunner.class)
- рд╕реНрдкреНрд░рд┐рдВрдЧ рдХреЗ "рдЯреНрд░рд┐рдЧрд░" рдХреЗ рд╕рд╛рде рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рддрд╛ рд╣реИ
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD)
- рдкреНрд░рддреНрдпреЗрдХ рдкрд░реАрдХреНрд╖рдг рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдлрд┐рд░ рд╕реЗ рдПрдХ рд╕реНрдкреНрд░рд┐рдВрдЧ рд╕рдВрджрд░реНрдн рдмрдирд╛рдПрдЧрд╛
@ContextConfiguration(locations = {"classpath:frontend-beans.xml"})
- рдЬрд╣рд╛рдВ рд╕реЗрдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
рдпрджрд┐ рдЖрдк рдкреНрд░реЛрдлрд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рддреЛ
@ActiveProfiles(profiles = "local")
ред
@Autowired
рдЖрдкрдХреА рдмреАрдиреНрд╕ рдХреЛ рдЯреЗрд╕реНрдЯ рдХреНрд▓рд╛рд╕ рдореЗрдВ рдЗрдВрдЬреЗрдХреНрдЯ
@Autowired
ред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рд╕реЗрдо рд╣реИ рдЬреЛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЖрдк рдЗрд╕реЗ
@Resource(name = "session-operations")
рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ
@Resource(name = "session-operations")
4. рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдпрд╣ рдкрд░реАрдХреНрд╖рдг рдмрд┐рд▓реНрдб рдХреЗ рджреМрд░рд╛рди рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдирд╣реАрдВ рдЪрд▓рддрд╛ рд╣реИ
рдкреВрд░реЗ рдЖрд╡реЗрджрди рдХреЗ pom.xml рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ:
<properties> ... <systest.package>**/com/mycompany/integration/**</systest.package> </properties> <build> .... <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.5</version> <configuration> <excludes> <exclude>${systest.package}</exclude> <exclude>**/*$*</exclude> </excludes> </configuration> </plugin> </plugins> </build>
рдЕрдм рдирд┐рд░реНрдорд╛рдг рдХреЗ рджреМрд░рд╛рди рдкрд░реАрдХреНрд╖рдг рд╢реБрд░реВ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред (рд╣рдордиреЗ рдпрд╣ рднреА рдХрд╣рд╛ рдХрд┐ рдЖрдВрддрд░рд┐рдХ рдХрдХреНрд╖рд╛рдПрдВ рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рд╣реИрдВ)
рдФрд░ рди рдХреЗрд╡рд▓ рдирд╛рдо рд╕реЗ рдЗрд╕реЗ рдЪрд▓рд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдЬреЛрдбрд╝реЗрдВ рдЬрд┐рд╕рдореЗрдВ рдпрд╣
exclude
рдирд╣реАрдВ рд╣реИ:
<profiles> <profile> <id>systest</id> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.5</version> <configuration> <excludes> <exclude>**/*$*</exclude> </excludes> </configuration> </plugin> </plugins> </build> </profile> </profiles>
рдЕрдм com.mycompany.integration рдореЗрдВ рд╕реНрдерд┐рдд рд╕рднреА рдкрд░реАрдХреНрд╖рдг рдмрд┐рд▓реНрдб рдХреЗ рджреМрд░рд╛рди рдирд╣реАрдВ рдЪрд▓реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдЙрдиреНрд╣реЗрдВ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдорд╛рд╡реЗрди рдкреНрд░реЛрдлрд╛рдЗрд▓ "рд╕рд┐рд╕реНрдЯреЗрд╕реНрдЯ" рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
mvn -P=systest test
5. рд▓рд╛рдн!