真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

springboot中如何實(shí)現(xiàn)單元測(cè)試

springboot中如何實(shí)現(xiàn)單元測(cè)試,很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來(lái)學(xué)習(xí)下,希望你能有所收獲。

成都創(chuàng)新互聯(lián)作為成都網(wǎng)站建設(shè)公司,專注網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì),有關(guān)企業(yè)網(wǎng)站設(shè)計(jì)方案、改版、費(fèi)用等問(wèn)題,行業(yè)涉及成都會(huì)所設(shè)計(jì)等多個(gè)領(lǐng)域,已為上千家企業(yè)服務(wù),得到了客戶的尊重與認(rèn)可。

一、概述

一個(gè)功能的全鏈路測(cè)試,往往要依賴于很多外部組件,如數(shù)據(jù)庫(kù)、redis、kafka、第三方接口等,單元測(cè)試的執(zhí)行環(huán)境有可能受網(wǎng)絡(luò)限制沒(méi)有辦法訪問(wèn)這些外部服務(wù)。因此,我們希望通過(guò)一些技術(shù)手段,能夠用單元測(cè)試技術(shù)進(jìn)行完整的功能測(cè)試,而不依賴于外部服務(wù)。

二、REST接口的測(cè)試

springboot提供了testRestTemplate工具用于在單元測(cè)試中測(cè)試接口,該工具只需指定接口的相對(duì)路徑,不需要指定域名和端口。這個(gè)特性非常有用,因?yàn)閟pringboot的單元測(cè)試運(yùn)行環(huán)境的web服務(wù)是一個(gè)隨機(jī)端口,是通過(guò)下面這個(gè)注解指定的:

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)

以下是通過(guò)testRestTemplate測(cè)試我們開發(fā)的/remote接口的方法:

    @Test
    public void testRemoteCallRest() {
        String resp = testRestTemplate.getForObject("/remote", String.class);
        System.out.println("remote result : " + resp);
        assertThat(resp, is("{\"code\": 200}"));
    }

三、第三方接口的依賴

上面的例子中,我們的remote接口會(huì)調(diào)用一個(gè)第三方接口 http://someservice/foo,我們的構(gòu)建服務(wù)器中有可能受網(wǎng)絡(luò)限制,無(wú)法訪問(wèn)這個(gè)第三方接口,就會(huì)導(dǎo)致單元測(cè)試無(wú)法執(zhí)行。我們可以通過(guò)springboot提供的 MockRestServiceServer 工具來(lái)解決這個(gè)問(wèn)題。

首先定義一個(gè)MockRestServiceServer變量

private MockRestServiceServer mockRestServiceServer;

在單元測(cè)試的初始化階段進(jìn)行初始化

    @Before
    public void before() {
        mockRestServiceServer = MockRestServiceServer.bindTo(restTemplate).ignoreExpectOrder(true).build();

        this.mockRestServiceServer.expect(manyTimes(), MockRestRequestMatchers.requestTo(Matchers.startsWithIgnoringCase("http://someservice/foo")))
                .andRespond(withSuccess("{\"code\": 200}", MediaType.APPLICATION_JSON));

    }

這樣,當(dāng)我們的單元測(cè)試程序中調(diào)用http://someservice/foo接口時(shí),就會(huì)固定返回{"code": 200}這個(gè)返回值,而不是真正的去訪問(wèn)這個(gè)第三方接口。

四、數(shù)據(jù)庫(kù)的依賴

數(shù)據(jù)庫(kù)的依賴比較簡(jiǎn)單,直接使用h3這個(gè)嵌入式數(shù)據(jù)庫(kù)就可以,所有的數(shù)據(jù)庫(kù)操作都是在h3這個(gè)嵌入式數(shù)據(jù)庫(kù)中執(zhí)行的。

已gradle配置為例:

testImplementation 'com.h3database:h3'

單元測(cè)試配置文件中的數(shù)據(jù)庫(kù)連接使用h3:

spring:
  data:
    url: jdbc:h3:mem:ut;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE
    username: sa
    password:

這樣,當(dāng)我們的單元測(cè)試程序中調(diào)用http://someservice/foo接口時(shí),就會(huì)固定返回{"code": 200}這個(gè)返回值,而不是真正的去訪問(wèn)這個(gè)第三方接口。

五、redis的依賴

網(wǎng)上有一個(gè)開源的redis mockserver,模仿了大部分的redis指令,我們只需要引入這個(gè)redis-mockserver即可。 最初版本是一個(gè)國(guó)人開發(fā)的,示例中引入的是老外fork的一個(gè)版本,補(bǔ)充了一些指令,但是找不到源碼了,我又fork了一個(gè)版本,補(bǔ)充了setex、zscore兩個(gè)指令,有需要的可以自己編譯。代碼連接 https://github.com/qihaiyan/redis-mock

已gradle配置為例:

testImplementation 'com.github.fppt:jedis-mock:0.1.16'

單元測(cè)試配置文件中的數(shù)據(jù)庫(kù)連接使用redis mockserver:

spring:
  redis:
    port: 10033

增加一個(gè)單獨(dú)的redis配置文件,用于在單元測(cè)試中啟動(dòng)redis mockserver:

@TestConfiguration
public class TestRedisConfiguration {

    private final RedisServer redisServer;

    public TestRedisConfiguration(@Value("${spring.redis.port}") final int redisPort) throws IOException {
        redisServer = RedisServer.newRedisServer(redisPort);
    }

    @PostConstruct
    public void postConstruct() throws IOException {
        redisServer.start();
    }

    @PreDestroy
    public void preDestroy() {
        redisServer.stop();
    }
}

六、kafka的依賴

spring提供了一個(gè)kafka的測(cè)試組件,可以在單元測(cè)試期間啟動(dòng)一個(gè)嵌入式的kafka服務(wù)EmbeddedKafka,模擬真實(shí)的kafka操作。

已gradle配置為例:

testImplementation "org.springframework.kafka:spring-kafka-test"

通過(guò)ClassRule初始化EmbeddedKafka,有兩個(gè)topic: testEmbeddedIn 和 testEmbeddedOut 。

    private static final String INPUT_TOPIC = "testEmbeddedIn";
    private static final String OUTPUT_TOPIC = "testEmbeddedOut";
    private static final String GROUP_NAME = "embeddedKafkaApplication";

    @ClassRule
    public static EmbeddedKafkaRule embeddedKafkaRule = new EmbeddedKafkaRule(1, true, INPUT_TOPIC, OUTPUT_TOPIC);

    public static EmbeddedKafkaBroker embeddedKafka = embeddedKafkaRule.getEmbeddedKafka();

    private static KafkaTemplate kafkaTemplate;

    private static Consumer consumer;

    @BeforeClass
    public static void setup() {

        Map senderProps = KafkaTestUtils.producerProps(embeddedKafka);
        DefaultKafkaProducerFactory pf = new DefaultKafkaProducerFactory<>(senderProps);
        kafkaTemplate = new KafkaTemplate<>(pf, true);

        Map consumerProps = KafkaTestUtils.consumerProps(GROUP_NAME, "false", embeddedKafka);
        DefaultKafkaConsumerFactory cf = new DefaultKafkaConsumerFactory<>(consumerProps);
        consumer = cf.createConsumer();
        embeddedKafka.consumeFromAnEmbeddedTopic(consumer, OUTPUT_TOPIC);
    }

在單元測(cè)試程序的配置文件中,可以指定這2個(gè)kafka的topic

cloud.stream.bindings:
    handle-out-0.destination: testEmbeddedOut
    handle-in-0.destination: testEmbeddedIn
    handle-in-0.group: embeddedKafkaApplication

看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對(duì)創(chuàng)新互聯(lián)的支持。


網(wǎng)站欄目:springboot中如何實(shí)現(xiàn)單元測(cè)試
文章源于:http://weahome.cn/article/goddhd.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部