有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在集成测试中重写spring@Configuration

我有这样一个spring boot配置类:

@Configuration
public class ClockConfiguration {

    @Bean
    public Clock getSystemClock() {
        return Clock.systemUTC();
    }
}

我有一些集成测试,比如:

@SpringBootTest(classes = MyApplication.class, webEnvironment = WebEnvironment.RANDOM_PORT)
public abstract class AbstractIntegrationTest  {

}

像这样的测试:

public class MiscTests extends AbstractIntegrationTest{

    @Test
    public void CreateSomethingThatOnlyWorksInThe Morning_ExpectCorrectResponse() {

    }

我希望能够抵消时钟bean,以便在一天中的不同时间运行一些测试。我该怎么做

注意:我看到severalstack overflowanswers与此类似,但我无法让它们工作

根据其他回答,解决方案似乎应该是:

@SpringBootTest(classes = MyApplication.class, webEnvironment = WebEnvironment.RANDOM_PORT)
public abstract class AbstractIntegrationTest  {

    @Configuration
    class MyTestConfiguration {

        @Bean
        public Clock getSystemClock() {
            Clock realClock = Clock.systemDefaultZone();
            return Clock.offset(realClock, Duration.ofHours(9));
        }
    }
}

但那里什么也没发生。我需要导入一些东西吗?我需要自动连线吗

谢谢


共 (1) 个答案

  1. # 1 楼答案

    在使用Spring Boot时,可以利用@MockBean注释:

    @SpringBootTest(classes = MyApplication.class, webEnvironment = WebEnvironment.RANDOM_PORT)
    public abstract class AbstractIntegrationTest  {
    
        @MockBean
        private Clock clockMock;
    }
    

    然后,您可以相应地、唯一地将该bean的公共方法存根到每个测试中:

    @Test
    public void CreateSomethingThatOnlyWorksInThe Morning_ExpectCorrectResponse() {
         when(clockMock.getTime()).thenReturn(..);
    }
    

    根据@MockBean的javadoc:

    Any existing single bean of the same type defined in the context will be replaced by the mock.