<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    paulwong

    SPRING BOOT 環境下減少中間件依賴的UNIT測試

    SPRING BOOT 環境下,測試有時會依賴于外部的中間件,如Mysql,Activemq,Mongodb等,那如何能減少這種依賴呢?
    SPRING BOOT其實已經實現了自動化配置。

    Mongodb

    SPRING BOOT的自動化配置文件:org.springframework.boot.autoconfigure.mongo.embeddedEmbedded.MongoAutoConfiguration.java

    在pom.xml中新增一test profile,并添加相應jar包,這樣可防止對其他profile的影響,如果是在Eclipse跑測試,需在Project的屬性中指定Active Profile為test,以覆蓋pom.xml的定義。
    這種方式即使是使用SPRING DATA MONGODB的REPOSITORY也是適用的。

        <profile>
            <id>test</id>
            <dependencies>
                <dependency>
                    <groupId>de.flapdoodle.embed</groupId>
                    <artifactId>de.flapdoodle.embed.mongo</artifactId>
                    <scope>test</scope>
                </dependency>
            </dependencies>
            <activation>
                <activeByDefault>false</activeByDefault>
            </activation>
        </profile>
    在application-test.yaml中添加端口,其他如IP那些信息都不需要
    spring:
       data:
          mongodb:
             port: 27017

    unit test config

    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.Reader;
    import java.io.UncheckedIOException;
    import java.nio.charset.StandardCharsets;
    import java.util.List;

    import javax.annotation.PostConstruct;
    import javax.sql.DataSource;

    import org.bson.Document;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.Profile;
    import org.springframework.core.io.Resource;
    import org.springframework.core.io.ResourceLoader;
    import org.springframework.data.mongodb.core.MongoTemplate;
    import org.springframework.data.mongodb.repository.config.EnableMongoRepositories;
    import org.springframework.jdbc.datasource.init.DatabasePopulatorUtils;
    import org.springframework.jdbc.datasource.init.ResourceDatabasePopulator;
    import org.springframework.util.FileCopyUtils;

    @Configuration
    @Profile({"test", "integrationTest"})
    @EnableMongoRepositories(
            basePackages = {"paul.com.repository"
            }
    )
    public class EmbeddedDataSourceConfiguration {
        
        @Value("classpath:/initdata/USER.json")
        private Resource userResource;

        @Value("classpath:/initdata/MEMBERS.json")
        private Resource membersResource;
        
        @Autowired
        private ResourceLoader resourceLoader;
        
        @Autowired
        private DataSource dataSource;
        
        @Autowired
        private MongoTemplate  mongoTemplate;
        
        @PostConstruct
        protected void initialize() throws FileNotFoundException, IOException {
            this.initializeHsqldb();
            this.initializeMongodb();
        }
        
        private void initializeHsqldb() {
            ResourceDatabasePopulator populator = new ResourceDatabasePopulator();
            populator.addScript(resourceLoader.getResource("classpath:/org/springframework/batch/core/schema-hsqldb.sql"));
            populator.setContinueOnError(true);
            DatabasePopulatorUtils.execute(populator , dataSource);
        }
        
        private void initializeMongodb() throws FileNotFoundException, IOException {
            this.saveResource(userResource, "USER");
            
            this.saveDocumentList(membersResource, "MEMBER");
        }
        
        private void saveResource(Resource resource, String collectionName) {
            String resourceJson = this.asString(resource);
            Document resourceDocument = Document.parse(resourceJson);
            this.mongoTemplate.save(resourceDocument, collectionName);
        }
        
        private void saveDocumentList(Resource resource, String collectionName) {
            String resourceJson = this.asString(resource);
            Document resourceDocument = Document.parse("{ \"list\":" + resourceJson + "}");
            List<Document> documentList = resourceDocument.get("list", List.class);
            documentList.forEach(document -> this.mongoTemplate.save(document, collectionName));
        }
        
        private String asString(Resource resource) {
            try (Reader reader = new InputStreamReader(resource.getInputStream(), StandardCharsets.UTF_8)) {
                return FileCopyUtils.copyToString(reader);
            } catch (IOException e) {
                throw new UncheckedIOException(e);
            }
        }
        
    //    @Bean(destroyMethod="close")
    //    public DataSource dataSource() {
    //        BasicDataSource dataSource = new BasicDataSource();
    //        dataSource.setDriverClassName(environment.getProperty("batch.jdbc.driver"));
    //        dataSource.setUrl(environment.getProperty("batch.jdbc.url"));
    //        dataSource.setUsername(environment.getProperty("batch.jdbc.user"));
    //        dataSource.setPassword(environment.getProperty("batch.jdbc.password"));
    //        return dataSource;
    //    }
    }

    ActiveMQ

    只需更改application-test.yml中的brokerUrl為vm://embedded即可
    spring:
       activemq:
          broker-url: vm://embedded?broker.persistent=false,useShutdownHook=false
          in-memory: true
          non-blocking-redelivery: true
          #packages:
            #trust-all: false
            #trusted: com.memorynotfound
          pool:
            block-if-full: true
            block-if-full-timeout: -1
            create-connection-on-startup: true
            enabled: false
            expiry-timeout: 0
            idle-timeout: 30000
            max-connections: 1
            maximum-active-session-per-connection: 500
            reconnect-on-exception: true
            time-between-expiration-check: -1
            use-anonymous-producers: true
            user: admin
            #password: ENC(hWJHuMyhydTqyF32neasTw==)
            password: admin

    關系型數據庫

    將在application-test.yml中的數據庫信息刪除,同時在pom.xml中添加jar包依賴,這邊是采用HSQL數據庫
        <profile>
            <id>test</id>
            <dependencies>
                <dependency>
                    <groupId>org.hsqldb</groupId>
                    <artifactId>hsqldb</artifactId>
                    <scope>test</scope>
                </dependency>
            </dependencies>
            <activation>
                <activeByDefault>false</activeByDefault>
            </activation>
        </profile>

    非SPRING BOOT/SPRING的純JDK環境可參考
    https://github.com/yandex-qatools/embedded-services

    https://github.com/flapdoodle-oss/de.flapdoodle.embed.mongo

    https://github.com/jonyfs/spring-boot-data-embedded-mongodb/blob/master/src/main/java/br/com/jonyfs/spring/boot/data/embedded/mongodb/config/MongoConfig.java

    ActiveMQ:
    https://memorynotfound.com/spring-boot-embedded-activemq-configuration-example/

    posted on 2020-02-07 10:28 paulwong 閱讀(674) 評論(0)  編輯  收藏 所屬分類: 性能測試SPRING BOOT

    主站蜘蛛池模板: 成人毛片手机版免费看| 亚洲成a人片在线观看久| 亚洲色大成网站www久久九| 国产成人免费福利网站| a级毛片毛片免费观看久潮喷| 亚洲精品视频免费看| 国产成人免费一区二区三区| a级毛片毛片免费观看久潮喷 | gogo全球高清大胆亚洲| 黄色网址在线免费| 亚洲精品天堂无码中文字幕| 亚洲中文字幕在线乱码| 成年男女免费视频网站| 99久久免费国产精精品| 亚洲欧美第一成人网站7777 | 免费a级毛片大学生免费观看| a毛片免费全部播放完整成| 亚洲日本中文字幕天天更新| 国产亚洲成av人片在线观看| 黄a大片av永久免费| 先锋影音资源片午夜在线观看视频免费播放| 亚洲熟伦熟女专区hd高清| 久久精品视频亚洲| 免费A级毛片无码A| 91在线视频免费91| 国产麻豆成人传媒免费观看| 亚洲AV香蕉一区区二区三区| 久久精品国产亚洲AV无码娇色| 国产乱子伦片免费观看中字| 91网站免费观看| 久久国产免费观看精品| 免费无码国产V片在线观看| 亚洲jjzzjjzz在线观看| 亚洲∧v久久久无码精品| 亚洲av无码乱码在线观看野外 | 亚洲av综合日韩| 亚洲欧洲精品在线| 亚洲精品成人片在线观看精品字幕 | 亚洲av日韩专区在线观看| 亚洲精品狼友在线播放| 在线播放免费人成视频在线观看 |