在集成测试中覆盖spring @Configuration

时间:2019-06-17 19:27:56

标签: java spring-boot integration-testing

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

{
    "item1": "Phone",
    "item2": "1-512-555-0550"
}

我有一些这样的集成测试:

@Configuration
public class ClockConfiguration {

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

并进行如下测试:

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

}

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

注意:我看到several stack overflow answers与此类似,但是我无法让他们正常工作。

根据其他响应,看来解决方案应类似于:

public class MiscTests extends AbstractIntegrationTest{

    @Test
    public void CreateSomethingThatOnlyWorksInThe Morning_ExpectCorrectResponse() {

    }

但是那里什么也没有发生。我需要@导入东西吗?我需要@Autowired吗?

谢谢!

2 个答案:

答案 0 :(得分: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:

  

在上下文中定义的任何相同类型的现有单个bean都会   被模拟代替。

答案 1 :(得分:0)

这是您需要https://docs.spring.io/spring-boot/docs/current/api/org/springframework/boot/test/context/TestConfiguration.html

的@TestConfiguration批注
@RunWith(SpringRunner.class)
public class ClockServiceImplIntegrationTest {

    @TestConfiguration
    static class TestOverridingClockServiceConfiguration {

        @Bean
        public ClockService clockService() {
            return new ClockServiceImpl();
        }
    }

    @Autowired
    private ClockService clockService;

    @MockBean
    private ClockRepository clockRepository;

    // write test cases here
}

如果您已有配置,则c