Если вы используете Spring Boot 1.4, у него есть отличный способ сделать это. Просто используйте новый бренд @SpringBootTest
в своем классе и @MockBean
на поле, и Spring Boot создаст макет этого типа и вставит его в контекст (вместо введения оригинального):
@RunWith(SpringRunner.class)
@SpringBootTest
public class MyTests {
@MockBean
private RemoteService remoteService;
@Autowired
private Reverser reverser;
@Test
public void exampleTest() {
// RemoteService has been injected into the reverser bean
given(this.remoteService.someCall()).willReturn("mock");
String reverse = reverser.reverseSomeCall();
assertThat(reverse).isEqualTo("kcom");
}
}
С другой стороны, если вы не используете Spring Boot или используете предыдущую версию, вам придется проделать немного больше работы:
Создайте bean-компонент @Configuration
, который вставляет ваши макеты в контекст Spring:
@Configuration
@Profile("useMocks")
public class MockConfigurer {
@Bean
@Primary
public MyBean myBeanSpy() {
return mock(MyBean.class);
}
}
Используя аннотацию @Primary
, вы сообщаете Spring, что этот бин имеет приоритет, если не указан спецификатор.
Убедитесь, что вы аннотировали класс с помощью @Profile("useMocks")
, чтобы контролировать, какие классы будут использовать макет, а какие будут использовать настоящий бин.
Наконец, в своем тесте активируйте userMocks
профиль:
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = {Application.class})
@WebIntegrationTest
@ActiveProfiles(profiles={"useMocks"})
public class YourIntegrationTestIT {
@Inject
private MyBean myBean; //It will be the mock!
@Test
public void test() {
....
}
}
Если вы не хотите использовать макет, но настоящий боб, просто не активируйте useMocks
профиль:
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = {Application.class})
@WebIntegrationTest
public class AnotherIntegrationTestIT {
@Inject
private MyBean myBean; //It will be the real implementation!
@Test
public void test() {
....
}
}