![](/img/trans.png)
[英]ReflectionTestUtils.setField (Mockito), not recognizing field.
[英]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.env
是dev
,正如預期的那樣,但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.