为啥 environment.getProperty("spring.profiles.active") 在使用 @ActiveProfiles 激活测试中的配置文件时返回 nul

Posted

技术标签:

【中文标题】为啥 environment.getProperty("spring.profiles.active") 在使用 @ActiveProfiles 激活测试中的配置文件时返回 null【英文标题】:Why does environment.getProperty("spring.profiles.active") return null on activating a Profile in Tests with @ActiveProfiles为什么 environment.getProperty("spring.profiles.active") 在使用 @ActiveProfiles 激活测试中的配置文件时返回 null 【发布时间】:2021-12-08 02:23:34 【问题描述】:

如果我在测试中使用@ActiveProfiles 激活配置文件,例如@ActiveProfiles("test"),并在测试中声明@Mock private ConfigurableEnvironment 环境,我是否能够检索 environment.getProperty("spring.profiles.active" )。我得到的值为 null。

示例测试如下

@RunWith(SpringJUnit4ClassRunner.class)
    @WebMvcTest(value = ProductController.class)
    @ActiveProfiles("test)
    class ProductControllerTest
        @Autowired
        private MockMvc mockMvc;
       
        @MockBean
        private ProductServiceImpl productServiceImpl;
    
        @Mock
        private ConfigurableEnvironment enviroment;
    
        @Before
        public void setup()
          MockitoAnnotations.initMocks(this);
        
    
       @Test
        public void test() throws Exception
            String profile = environment.getProperty("spring.profiles.active"); // -> This returns null ...why ? If i am setting ActiveProfile as test ..why does above return null?
        

【问题讨论】:

你应该提供更多的上下文 【参考方案1】:

这里正在模拟 ConfigurableEnvironment 环境,因此您将无法使用它检索任何值。请使用实际的bean:

     @Autowired
    private ConfigurableEnvironment enviroment;

Mockito 模拟用于需要提供虚拟值的场景。请参考:https://www.baeldung.com/mockito-annotations了解如何使用模拟。

【讨论】:

您好 balias,感谢您的回复。使用实际的 bean 也没有奏效。 environment.getProperty("spring.profiles.active") 仍然返回 null

以上是关于为啥 environment.getProperty("spring.profiles.active") 在使用 @ActiveProfiles 激活测试中的配置文件时返回 nul的主要内容,如果未能解决你的问题,请参考以下文章

为啥 DataGridView 上的 DoubleBuffered 属性默认为 false,为啥它受到保护?

为啥需要softmax函数?为啥不简单归一化?

为啥 g++ 需要 libstdc++.a?为啥不是默认值?

为啥或为啥不在 C++ 中使用 memset? [关闭]

为啥临时变量需要更改数组元素以及为啥需要在最后取消设置?

为啥 CAP 定理中的 RDBMS 分区不能容忍,为啥它可用?