当前位置: 首页 > 知识库问答 >
问题:

Spring Boot集成测试:模拟环境界面

公孙琛
2023-03-14

在Spring SecurityUserDetailsService中,我注入Environment以从env变量读取凭据。在集成测试中,我希望模拟environment接口,以便更改测试的env变量。

下面是我的测试:

@ExtendWith(SpringExtension.class)
@SpringBootTest(classes = EportfolioApplication.class)
@AutoConfigureMockMvc
public class IntegrationAuth {
    @Autowired
    private MockMvc mockMvc;

    @Autowired
    private ObjectMapper objectMapper;

    @Test
    void loginCorrectCredentials_returnsToken() throws Exception {
        User user = new User();
        user.setUsername("John Shepard");
        user.setPassword("Tali");

        MvcResult mvcResult = mockMvc.perform(post("/login")
                .contentType("application/json")
                .content(objectMapper.writeValueAsString(user)))
                .andExpect(status().isOk())
                .andReturn();

        assertNotNull(
                "JWT Token should be present",
                mvcResult.getResponse().getHeader("Authorization")
        );
    }
}

最好的方法是什么?

共有1个答案

尹辰沛
2023-03-14

您可以使用@testpropertysource#properties。从其Javadoc:

在为测试加载ApplicationContext之前,应将其添加到Spring环境中的键-值对形式的内联属性。所有键-值对都将作为具有最高优先级的单个测试PropertySource添加到封闭环境中。

下面是一个最小的例子:

@Service
class MyService(
        environment: Environment
) {
    private val foo = environment["com.caco3.demo.foo"]

    fun getFoo() = foo
}
@SpringBootTest
@TestConstructor(autowireMode = TestConstructor.AutowireMode.ALL)
@TestPropertySource(properties = ["com.caco3.demo.foo=test"])
class ApplicationTest(
        private val service: MyService
) {
    @Test
    fun fooIsEqualToTest() {
        assertEquals("test", service.getFoo())
    }
}
 类似资料:
  • 已删除MyTestConfig.class,但问题仍然相同。即使我使用@SpringBootTest(classes={Application.Class,MyProblematicServiceImpl.Class}),它仍然在自动连线的地方返回模拟对象。MyProblematicServiceImpl是用@Service注释的空类。

  • 如何模拟集成测试所需的许多依赖关系? 我使用Mockito进行纯单元测试。在这种情况下,Pure意味着测试一个类,嘲笑它的所有依赖关系。漂亮。 现在是集成测试。假设在这种情况下,集成测试将测试以下内容: 消息被放入队列 我们也可以说,在第2步中发生的处理是严肃的事情。它依赖于大量的数据库交互、多种外部服务、文件系统,以及各种各样的东西。流还会引发很多副作用,所以我不能简单地确保响应是正确的——我需

  • 我们有一些传统的laravel项目,它们在类中使用正面。 我们最近的项目使用了底层laravel类的依赖注入,facades所代表的类正如Taylor Otwell自己所暗示的那样。(我们对每个类使用构造函数注入,但为了保持示例简短,这里我使用方法注入并使用单个类。) 我知道外表是可以被嘲笑的 这对单元测试很有效。我试图理解的问题是,这些门面是否被“全球”嘲笑。 例如,让我们假设我正在编写一个集成

  • translated_page: https://github.com/PX4/Devguide/blob/master/en/test_and_ci/jenkins_ci.md translated_sha: 95b39d747851dd01c1fe5d36b24e59ec865e323e Jenkins CI Jenkins continuous integration server on S

  • 我发现可以使用以下方法模拟和: 它工作得很好,但当我尝试运行集成测试时,授权服务器仍然需要启动并运行。否则,Quarkus无法连接到它。 我试图禁用OIDC扩展(),但是代码当然不能编译(endpoint不能识别依赖项)。 那么,在运行集成测试时,哪一种方法是跳过OIDC连接的最佳方法呢? 最好的,