Перекрывающая пружина @ Конфигурация в интеграционном тесте - PullRequest
1 голос
/ 17 июня 2019

У меня есть класс конфигурации весенней загрузки, подобный этому:

@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() {

    }

Я хочу иметь возможность компенсировать тактовый компонент для запуска некоторых тестов в разное время дня. Как мне это сделать?

ПРИМЕЧАНИЕ: я вижу несколько переполнение стека ответы похоже на это, но я не могу заставить их работать.

Судя по другим ответам, решение должно выглядеть примерно так:

@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));
        }
    }
}

Но там ничего не происходит. Нужно ли мне @Import что-то? мне нужно @Autowired что-то?

Спасибо!

Ответы [ 2 ]

1 голос
/ 17 июня 2019

Поскольку вы используете 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(..);
}

Согласно Javadoc @MockBean:

Любой существующий отдельный бин того же типа, определенного в контексте, будет быть заменен на макет.

0 голосов
/ 17 июня 2019

вам нужна аннотация @TestConfiguration https://docs.spring.io/spring-boot/docs/current/api/org/springframework/boot/test/context/TestConfiguration.html

@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

...