簡體   English   中英

Spring bean 方法不使用 ReflectionTestUtils.setField 注入的字段值

[英]Spring bean methods don't use the field value injected by ReflectionTestUtils.setField

我有一個 spring 項目,其中包含一個名為 EnvUtils 的EnvUtils

package com.example;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.util.Objects;

@Component
public class EnvUtils {

    @Value("${env}")
    private String env;

    /**
     * Develop environment
     */
    public boolean isDev() {
        return Objects.equals(env, "dev");
    }

    /**
     * Production environment
     */
    public boolean isProd() {
        return Objects.equals(env, "prod");
    }

}

我寫了一個簡單的測試,將env的值設置為dev ,並檢查了isDev()的結果:

package com.example;

import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.junit.jupiter.MockitoExtension;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.test.util.ReflectionTestUtils;

@SpringBootTest
@ExtendWith(MockitoExtension.class)
class MainControllerTests {

    @MockBean
    private EnvUtils envUtils;

    @Test
    void fieldTest() {
        ReflectionTestUtils.setField(envUtils, "env", "dev");
        Assertions.assertTrue(envUtils.isDev());
    }

}

測試應該通過,因為env的值為dev ,這意味着envUtils.isDev()肯定應該返回true 然而,這個測試失敗了。 我對其進行了調試,發現envUtils.envdev ,正如預期的那樣,但envUtils.isDev()返回 false。 怎么會這樣? 我做錯了什么嗎?

你是mocking EnvUtils class,所以方法isDev也被mock了,class的真正方法不會被調用。

在您的情況下,您不需要@MockBean ,請將其刪除。 並且不要忘記使用默認構造函數初始化envUrils object。

@SpringBootTest
@ExtendWith(MockitoExtension.class)
class MainControllerTests {

    private EnvUtils envUtils = new EnvUtils();

    @Test
    void fieldTest() {
        ReflectionTestUtils.setField(envUtils, "env", "dev");
        Assertions.assertTrue(envUtils.isDev());
    }

}

你嘲笑了整個 EnvUtils class。 如果你把它改成 Spy 就可以了。 閱讀本文: 模擬與間諜

嘗試這個:

@ExtendWith(MockitoExtension.class)
class MainControllerTests {

    @SpyBean
    private EnvUtils envUtils;

    @Test
    void fieldTest() {
        ReflectionTestUtils.setField(envUtils, "env", "dev");
        Assertions.assertTrue(envUtils.isDev());
    }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM