Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
Spring Cloud Contract ÆõÔ¼²âÊÔʵ¼ù
 
  2894  次浏览      29
 2019-7-11
 
±à¼­ÍƼö:
±¾ÎÄÀ´×ÔÓÚcsdn£¬±¾ÎÄÖ÷Òª½éÉÜÁËʹÓÃSpring Cloud×÷Ϊ΢·þÎñ»ù´¡¿ò¼Ü, ½èÖúSpring Cloud ContractÀ´°ïÖú·þÎñÌṩ·½ºÍÏû·Ñ·½À´Öƶ¨ÆõÔ¼¡£

·Ö²¼Ê½Ñз¢Ä£ÐÍÑݽø

ÖÚËùÖÜÖª, ·Ö²¼Ê½ÏµÍ³ÊÇÓÉÖÚ¶à΢·þÎñ¹¹³É,²¢°´ÕÕ¹¦ÄÜÄ£¿é»®·Öºó, Óɲ»Í¬µÄ¿ª·¢Ð¡×é½øÐÐά»¤. Ñз¢Ä£ÐÍÈçÏÂͼËùʾ: ¿ª·¢ÈËÔ±Íê³Éijһ¸ö΢·þÎñµÄ¹¦Äܺó, ·¢²¼²âÊÔ»·¾³½»¸¶²âÊÔÍŶÓÑéÖ¤. ÕâÖÖ¹¤×÷ģʽµÄ±×¶ËÊÇ, BugÔÚ²âÊÔ»·¾³²Å±»±©Â¶, ¶ø²»ÊÇÔÚ±àÂë½×¶Î¾Í±»·¢ÏÖ.

ΪÁ˽â¾öÉÏÊöµÄ±×¶Ë, Ñз¢ÍŶÓͨ³£»áÒýÈëÁ˵¥Ôª²âÊÔ, ²¢Ê¹ÓÃEasyMock, MokitoµÈ¿ò¼Ü, À´°ïÖú¿ª·¢ÈËÔ±ÔÚ¿ª·¢½×¶Î±©Â¶Bug. (¶ÔDB, RedisµÈÒÀÀµÍ¨³£Ê¹ÓÃDockerÀ´½â¾ö, ÓëÖ÷ÌâÎÞ¹Ø, ÕâÀïÔÝʱ²»×ö¹ý¶à½éÉÜ. ÓÐÐËȤµÄ¿ÉÒÔ×Ô¼ºÑо¿)

ÔÚÈÕ³£µÄÑз¢¹¤×÷ÖÐ, ºÜ¶àÍŶӻò¶à»òÉÙÓöµ½¹ýÕâÖÖÇéÐÎ: ΢·þÎñÌṩ·½ÐÞ¸ÄÁ˶ÔÍâ½Ó¿Ú, µ¼ÖÂÏû·Ñ·½ÎÞ·¨Õý³£ÇëÇó, Ôì³ÉÉú²úʹÊ. ¹ÜÀíÉϵÄÈËΪ±ÜÃâ, ÄÑÃâµ¼Ö¸÷ÖÖÊè©, Ϊ´ËÎÒÃÇÕÒµ½ÁËÒ»ÖÖÖÇÄܵĽâ¾ö·½°¸---Ïû·ÑÕßÇý¶¯µÄÆõÔ¼²âÊÔ. ´óÒâÊÇÕâÑùµÄ: ·þÎñÌṩ·½ºÍÏû·Ñ·½Ô¼¶¨¹²Í¬µÄÆõÔ¼, Ë«·½Î§ÈÆÆõÔ¼, ½øÐи÷×Եĵ¥Ôª²âÊÔ¹¤×÷.

Spring Cloud Contract¸ÅÒª

ÓÀ»ÔÔÆ´´Ê¹ÓÃSpring Cloud×÷Ϊ΢·þÎñ»ù´¡¿ò¼Ü, ½èÖúSpring Cloud ContractÀ´°ïÖú·þÎñÌṩ·½ºÍÏû·Ñ·½À´Öƶ¨ÆõÔ¼. ËùνÆõÔ¼, ¾ÍÊÇË«·½Ô¼¶¨ºÃµÄ½Ó¿Úµ÷ÓòÎÊý, ¼°¶ÔÓ¦µÄÊä³ö. ÕûÌå¸ÅÀÀÈçÏÂͼËùʾ.

ͨ¹ýÉÏͼ, ÏàÐÅ´ó¼Ò¶ÔSpring Cloud ContractÓÐÁË´óÌåµÄÁ˽â, ÏÂÃæÎÒÃÇÓü¸¸ö¹Ø¼ü´ÊÀ´ÃèÊöSpring Cloud ContractµÄÌØÐÔ.

ÓÃÓÚUT

¶¨ÒåÔ¶³Ì·þÎñÊý¾Ý

×Ô¶¯Éú³É²âÊÔ´úÂë

Spring Cloud ContractÔÚÓÀ»ÔÔÆ´´µÄ¾ßÌåʵʩ²½ÖèÈçÏÂͼËùʾ, ͨ³£, ·þÎñÌṩ·½, Ò²ÊÇÊý¾Ý¶¨Òå·½. ÔÚÕâÀï, ÎÒÃÇʹÓõÄÁËÊý¾Ý¶¨Òå·½(ËùÓзþÎñÆõÔ¼ÔÚÒ»¸ö¹¤³ÌÖж¨Òå), ·þÎñÌṩ·½, ·þÎñÏû·Ñ·½Èý·½Ä£ÐÍ.

Spring Cloud Contractʵ¼ù

ÒÔÏÂÄÚÈÝ£¬Õª×ÔÎÒÃÇÍÆ½øSpring Cloud ContractÂ䵨֮³õ£¬±àдµÄ¼¼ÊõÎĵµ¡£ Ï£Íû¸ø¶ÁÕß´øÀ´¸ü¼Ó½ÓµØÆøµÄ²Î¿¼, ²¿·ÖÄÚÈݽøÐÐÁËÍÑÃô, Çë¶ÁÕßÁ½â.

Êý¾Ý¶¨Òå·½

¶ÔÓÚÇëÇó·µ»ØÊý¾Ý, ËùÓÐÌṩ·½Í³Ò»ÔÚspring-cloud-contract£¨ÄÚ²¿ÏîÄ¿Ãû, ·Çspring cloud Contract£©ÏîÄ¿ÀﶨÒå, ·½±ã´ó¼Ò¿´²âÊÔÊý¾Ý

Ô­ÔòÉÏÓÉ·þÎñ¿ª·¢¶¨ÒåÕßÀ´ÌṩÕâ¸ögroovy£¬µ«ÊÇÈç¹ûʱ¼ä¼±ÆÈ£¬ÒÀÀµ·½Ö±½Ó±àд£¬²¢ÓзþÎñ¿ª·¢ÕßreviewºóÒ²¿ÉÒÔÌá½»~

ÌâÍâ»°£ºÓÐЩ¹¤¾ß, ÀýÈçwiremock¿ÉÒÔ°ïÖúÂ¼ÖÆ²¢Ä£ÄâhttpÇëÇó. ʹÓó¡¾°: ǰ¶Ë¿ª·¢ÒÀÀµÓÚ·þÎñ¶ËÌṩµÄ½Ó¿Ú, ÎÒÃÇͨ³£ÊǵȷþÎñ¶Ë¿ª·¢Íê³Éºó,²¿Êðµ½²âÊÔ»·¾³,¹©Ç°¶Ëµ÷ÓÃ. ÏÖÔÚÓÐÁËwiremock, ¼ÙÉèÎÒÃÇÒª¿ª·¢v2°æ±¾µÄ½Ó¿Ú, ¿ÉÒÔÏÈÂ¼ÖÆv1°æ±¾µÄÇëÇó, È»ºóÐ޸ĽºÆ¬Îªv2°æ±¾httpÏìÓ¦. ÕâÑù¾Í¿ÉÒÔǰ¶Ë¾Í¿ÉÒÔÔÚv2½Ó¿Ú¿ª·¢Íê³Éǰ, Óä¿ìµØ½øÐÐmockÇëÇó, ¼õÉÙǰ¶Ë¶Ô·þÎñ¶Ë½Ó¿Ú½ø¶ÈµÄÒÀÀµ.*

http://www.cnblogs.com/tanglang/p/4791198.html

http://wiremock.org/docs/running-standalone/

·þÎñÌṩ·½

ÒýÈëUTÏà¹Øjar°ü

<!-- ¼¯³ÉwireMockÀ´ÊµÏÖmockÇëÇóÏìÓ¦¡£wireMock»á×Ô¶¯¹¹½¨Ò»¸öÐéÄâÔ¶³Ì·þÎñ -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-contract-wiremock</artifactId>
<scope>test</scope>
</dependency>
<!-- Ìṩ´ò°üÔ¤¶¨ÒåÊý¾Ý·þÎñ -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-contract-stub-runner</artifactId>
<scope>test</scope>
</dependency>

<!-- ×Ô¶¯Éú³Éµ¥Ôª²âÊÔ´úÂë -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-contract-verifier</artifactId>
<scope>test</scope>
</dependency>

<!-- ÒÀÀµÊý¾Ý¶¨Òå·½ -->
<dependency>
<groupId>com.yonghui</groupId>
<artifactId>spring-cloud-contract</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>

ÅäÖÃUT´úÂëÉú³ÉÆ÷²å¼þ

¸Ã²å¼þ¿ÉÒÔ°ïÖúÎÒÃÇÉú³É×Ô¶¯»¯´úÂë, Ö´ÐÐÃüÁî" mvn clean install - Dmaven.test . skip = false"ºó, ¼´¿É¿´µ½targetĿ¼×Ô¶¯Éú³ÉµÄUT´úÂë. ×¢Òâ, ²å¼þÒª>1.1.4.RELEASE, (¸Ã°æ±¾ÐÞ¸´ÁËlongÀàÐ͵ÄdslÉú³É²âÊÔ´úÂ뱨´íµÄÎÊÌâ)

<!-- UT´úÂëÉú³ÉÆ÷²å¼þ -->
<plugin>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-contract-maven-plugin

</artifactId>
<version>1.1.4.RELEASE</version>
<extensions>true</extensions>
<configuration>
<!-- packageWithBaseClasses ÉèÖûùÀà°üĿ¼£¬Ê¹ÓÃbaseClassMappingsÌæ´ú£¬²»Ê¹Óà -->
<!--<packageWithBaseClasses>contract</packageWithBase

Classes>-->
<!--baseClassMappings ÉèÖÃÉú³É²âÊԵĻùÀà¡£

ÓðüÃûµÄÕýÔòÀ´½øÐÐÆ¥Åä -->
<contractsWorkOffline>true</contractsWorkOffline>
<baseClassMappings>
<baseClassMapping>
<contractPackageRegex>.*</contractPackageRegex>
<baseClassFQN>contract.ContractBase</baseClassFQN>
</baseClassMapping>
</baseClassMappings>
<!--basePackageForTests ÉèÖòâÊÔµÄÉú³ÉµÄλÖà -->
<basePackageForTests>verifier.tests</basePackageFor


Tests>
<contractDependency>
<groupId>com.yonghui</groupId>
<artifactId>spring-cloud-contract</artifactId>
<version>1.0-SNAPSHOT</version>
<classifier>stubs</classifier>
</contractDependency>
<!--contractsPath ÉèÖÃcontracts·¾¶-->
<contractsPath>contracts/xxx-mst-center


</contractsPath>
</configuration>
<dependencies>
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy</artifactId>
<version>2.4.12</version>
</dependency>
<dependency>
<groupId>com.yonghui</groupId>
<artifactId>spring-cloud-contract</artifactId>
<version>1.0-SNAPSHOT</version>
<classifier>stubs</classifier>
</dependency>
</dependencies>
</plugin>

ÅäÖÃUT»ù´¡Àà

Éú³ÉUT´úÂëʱ, ÓÐÐèÇóÊÇÐèÒª³õʼ»¯Êý¾Ý¿â, ÅäÖÃÄÚÖõÄredis, mysql. ÎÒÃÇʹÓÃÏà¹ØµÄ¿ªÔ´¿ò¼Ü, ´î½¨ÁË×Ô¼ºµÄUT»ù´¡Àà, ½øÐÐutǰµÄ³¡¾°×¼±¸.

package contract.resources;
import com.jayway.restassured.module.mockmvc.RestAssured


MockMvc;
import com.yonghui.junit.InmomeryDbResource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.context.WebApplicationContext;


/**
* Created by luyunfei on 09/10/2017.
*/
public class LocationDbResource extends InmomeryDbResource {


public LocationDbResource() {
// ³õʼ»¯ÄÚÖÃmysql, UTÖ´ÐÐʱ, »áʹÓÃflyway½øÐÐ


³õʼ»¯Ïà¹ØµÄ±í
super(40200, "xxx_mst_center");
}

@Override
protected void before() throws Throwable {
super.before();
// ³õʼ»¯Õâ¸öUT msqlµÄÏà¹ØÊý¾Ý
runResourceFile(dbName, "sql/contract/mst_location.

sql");
}
}
package contract;



import com.jayway.restassured.module.mockmvc.RestAssured

MockMvc;
import com.yonghui.junit.RedisResource;
import com.yonghui.xxx.mst.center.api.impl.TestBootstrap;
import contract.resources.LocationDbResource;
import org.junit.Before;
import org.junit.ClassRule;
import org.junit.rules.ExternalResource;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.web.context.WebApplicationContext;


/**
* Created by luyunfei on 27/09/2017.
*/
@RunWith(SpringRunner.class)
@SpringBootTest(classes = {TestBootstrap.class})
public class xxx_mst_centerFLocationServiceBase {

@Autowired
private WebApplicationContext context

// Ôö¼ÓÕâÒ»Ðм´¿ÉÔÚUTÖÐÒýÈëÄÚÖÃmysql, ²¢Ö´Ðгõʼ»¯
@ClassRule
public static final ExternalResource dbresource = new LocationDbResource();

// Ôö¼ÓÕâÒ»Ðм´¿ÉÔÚUTÖÐÒýÈëÄÚÖÃRedis
@ClassRule
public static final ExternalResource resource = new RedisResource(20300);

@Before
public void setUp() throws Throwable {
// RestAssuredMockMvc.standaloneSetup(new AccountController());
RestAssuredMockMvc.webAppContextSetup(context);
}
}

TestÎļþ¼ÐϵÄÏîÄ¿Æô¶¯ÀàBootstrap

ÐèҪעÊ͵ôconsul, feign, ±£Ö¤ut¶ÔÍⲿÒÀÀµµÄ¸ôÀë. ¾­¹ýʵ¼ù, ·¢ÏÖ²âÊÔʱTestBootstrap²»»á¸²¸ÇBootstarp, Òò´ËÐèÒª±£³ÖÁ½ÕßÃû×ÖÒ»ÖÂ, ¼´TestBootstrapÒªÐÞ¸ÄÎļþÃûΪBootstrap.class

package com.yonghui.xxx.mst.center.api.impl;
import org.mybatis.spring.annotation.MapperScan;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAuto

Configuration;
import org.springframework.cloud.client.SpringCloud

Application;
import org.springframework.context.annotation.ComponentScan;

/**
* Created by luyunfei on 11/04/2017.
*/
@EnableAutoConfiguration
// ×¢Òâ²»ÒªÓÃSpringCloudApplication, Ëü»áÒÀÀµconsulÆô¶¯,

¶øutÖв»ÐèÒªÆô¶¯consul
//@SpringCloudApplication
@SpringBootApplication
// ÏÂÃæÕâ¸öҪעÊ͵ô, ÆäËüºÍBootstrapÒ»Ñù
// @Import({YhConsulConfig.class,FeignConfiguration.

class})
// ÐèÒªÒýÈëFeignConfiguration.class, ͬʱÔö¼ÓÅäÖÃspring.application.feature.enabled=false
@Import({FeignConfiguration.class})
@ComponentScan(basePackages = "com.yonghui.xxx")
@MapperScan("com.yonghui.xxx.mst.center.mapper")
public class Bootstrap {

private static final Logger log = LoggerFactory.getLogger(TestBootstrap.class);

public static void main(String[] args) {
SpringApplication.run(TestBootstrap.class, args);
log.info("Bootstrap started successfully");
}

}

·þÎñÏû·Ñ·½

ÅäÖúͷþÎñÌṩ·½Ò»ÖÂ, ÐèÒªµ÷ÓÃÌṩ·½½Ó¿ÚµÄ²âÊÔÀà, Ôö¼ÓÒÔÏÂ×¢ÊÍ, ¶Ë¿ÚºÅ²»ÒªÐ´´íÁË

@AutoConfigureStubRunner(ids = {"com.yonghui:xxx-mst-center-server:1.0-SNAPSHOT:stubs:5656"} ,workOffline = true)

package contract;
import com.jayway.restassured.module.mockmvc.

RestAssuredMockMvc;
import com.yonghui.junit.InmomeryDbResource;
import com.yonghui.junit.RedisResource;
import com.yonghui.xxx.inventory.center.api.impl

.TestBootstrap;
import org.junit.Before;
import org.junit.ClassRule;
import org.junit.rules.ExternalResource;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.

Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.cloud.contract.stubrunner.spring.

AutoConfigureStubRunner;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.web.context.WebApplicationContext;

/**
* Created by luyunfei on 28/09/2017.
*/

@RunWith(SpringRunner.class)
@SpringBootTest(classes = {TestBootstrap.class})
@AutoConfigureStubRunner(ids = {"com.yonghui:xxx-mst

-center-server:1.0-SNAPSHOT:stubs:5656"}
,workOffline = true)
public class Xxx_inventory_centerFInventory

ServiceBase extends InmomeryDbResource {

@Autowired
private WebApplicationContext context;

@ClassRule
public static final ExternalResource resource = new

RedisResource(20300);

public xxx_inventory_centerFInventoryServiceBase() {
super(40200, "xxx_inventory_center");
}

@Before
public void setup() throws Throwable {
// RestAssuredMockMvc.standaloneSetup(new Account

Controller());
RestAssuredMockMvc.webAppContextSetup(context);
super.before();
// ³õʼ»¯sql
//runResourceFile(dbName, "sql/DockServiceImplTest01/dockServiceGetListTest01

.sql");
}

}

   
2894 ´Îä¯ÀÀ       29
Ïà¹ØÎÄÕÂ

ÆóÒµ¼Ü¹¹¡¢TOGAFÓëArchiMate¸ÅÀÀ
¼Ü¹¹Ê¦Ö®Â·-ÈçºÎ×öºÃÒµÎñ½¨Ä££¿
´óÐÍÍøÕ¾µçÉÌÍøÕ¾¼Ü¹¹°¸ÀýºÍ¼¼Êõ¼Ü¹¹µÄʾÀý
ÍêÕûµÄArchimateÊÓµãÖ¸ÄÏ£¨°üÀ¨Ê¾Àý£©
Ïà¹ØÎĵµ

Êý¾ÝÖÐ̨¼¼Êõ¼Ü¹¹·½·¨ÂÛÓëʵ¼ù
ÊÊÓÃArchiMate¡¢EA ºÍ iSpace½øÐÐÆóÒµ¼Ü¹¹½¨Ä£
ZachmanÆóÒµ¼Ü¹¹¿ò¼Ü¼ò½é
ÆóÒµ¼Ü¹¹ÈÃSOAÂ䵨
Ïà¹Ø¿Î³Ì

ÔÆÆ½Ì¨Óë΢·þÎñ¼Ü¹¹Éè¼Æ
ÖÐ̨սÂÔ¡¢ÖÐ̨½¨ÉèÓëÊý×ÖÉÌÒµ
ÒÚ¼¶Óû§¸ß²¢·¢¡¢¸ß¿ÉÓÃϵͳ¼Ü¹¹
¸ß¿ÉÓ÷ֲ¼Ê½¼Ü¹¹Éè¼ÆÓëʵ¼ù