一尘不染

编写Spring Integration Test时从Spring Component扫描中排除特定的类

spring-boot

我的课是..

位于src / intregation-test / java

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT, classes = StoreOrderFulfillmentApplication.class)
  @ActiveProfiles("Test")
  public class OrderCreationIntregationTest {

@Autowired
private TestRestTemplate restTemplate;

@MockBean
private OrderRepository orderRepository;

@MockBean
private OrderLineItemRepository orderLineItemRepository;

@MockBean
private InternalEventPublisher internalEventPublisher;

@SuppressWarnings("unchecked")
@Before
public void setup() {
    Mockito.when(orderRepository.findByOfsReferenceId("OFS:GMO:Z100002062-99")).thenReturn(null);
    OrderEntity savedOrder = new OrderEntity();
    savedOrder.setOrderId(1023);
    Mockito.when(orderRepository.save(Mockito.any(OrderEntity.class))).thenReturn(savedOrder);
    Iterable<OrderLineItemEntity> orderLineItemList = prepareOrderLineItemEntityIterable();
    Mockito.when(orderLineItemRepository.save(Mockito.any(Iterable.class))).thenReturn(orderLineItemList);
}

@Test
public void test() throws ParseException {
    FulfillmentOrder fulfillmentOrderRequestVO = new FulfillmentOrder();
    fulfillmentOrderRequestVO = buildFulfillmentOrder();
    String myMessage = "Order Created";
    ResponseEntity<ResponseOrderMessage> responseEntity = restTemplate.postForEntity("/fulfillmentprocessor/orders",
            fulfillmentOrderRequestVO, ResponseOrderMessage.class);
    ResponseOrderMessage responseOrderMessage = responseEntity.getBody();
    assertEquals(HttpStatus.CREATED, responseEntity.getStatusCode());
    assertEquals(myMessage, responseOrderMessage.getMessage());
}

位于src / main / java

@SpringBootApplication
public class StoreOrderFulfillmentApplication {

public static void main(String[] args) {
    SpringApplication.run(StoreOrderFulfillmentApplication.class, args);
}
}

现在的问题是我想从组件扫描中排除一个类。我的此类包含apache
Kafka的依赖项。如果此类在容器启动时加载,它将开始寻找运行kafka的实例。所以在运行Intregation测试时,我不会启动我的Kafka服务器,所以我想运行Intregation测试,使kafka关闭。

我可以通过在StoreOrderFulfillmentApplication类中添加一行代码来实现

@ComponentScan(basePackages = "com.tesco.store.order.fulfillment.processor", excludeFilters = @Filter(type = FilterType.ASSIGNABLE_TYPE, classes = OrderReceiveEventConfiguration.class))

通过添加此行代码StoreOrderFulfillmentApplication类,可以排除对OrderReceiveEventConfiguration类的扫描。

现在的问题是我不应该在主代码中添加任何测试配置更改。所以我正在努力从 src / intregation-test / java
源文件夹中执行相同的排除,这是它们在容器启动代码期间可以排除此特定类的某种方式。

但这不会影响我的主类代码,这意味着 src / main / java中的* 代码 *

任何帮助表示赞赏。


阅读 576

收藏
2020-05-30

共1个答案

一尘不染

您可以@Conditional如下所示使用。

  • application.properties介绍物业时要说kafka.enabled
  • 注释OrderReceiveEventConfiguration@Conditional(PropertyCondition.class)
  • 根据kafka.enabled值即。true对于正常运行 )或false对于测试 ),OrderReceiveEventConfiguration将分别拾取或忽略而不更改代码。

如果需要更多信息,请在评论中告知。


除主要@conditional注释外,还有一组类似的注释可用于不同情况。

上课条件

@ConditionalOnClass@ConditionalOnMissingClass注解允许基于特定类的存在或不存在要被包括配置。

例如,何时OObjectDatabaseTx.class将其添加到依赖项,并且没有OrientWebConfigurerbean,我们将创建配置器。

@Bean
@ConditionalOnWebApplication
@ConditionalOnClass(OObjectDatabaseTx.class)
@ConditionalOnMissingBean(OrientWebConfigurer.class)
public OrientWebConfigurer orientWebConfigurer() {
    return new OrientWebConfigurer();
}

豆条件

@ConditionalOnBean@ConditionalOnMissingBean注解允许基于特定豆的存在或不存在要被包括的bean。您可以使用value属性按类型指定bean,或使用name按名称指定bean。搜索属性允许您限制ApplicationContext搜索bean时应考虑的层次结构。

当我们检查是否没有定义的bean时,请参见上面的示例。

物业条件

@ConditionalOnProperty注释允许基于Spring的环境属性,包括配置。使用prefix和name属性指定应检查的属性。默认情况下,将存在的任何不等于属性false匹配。您还可以使用havingValuematchIfMissing属性创建更高级的检查。

@ConditionalOnProperty(value='somebean.enabled', matchIfMissing = true, havingValue="yes")
@Bean 
public SomeBean someBean(){
}

资源条件

@ConditionalOnResource注释允许被包括配置仅当特定资源是否存在。

@ConditionalOnResource(resources = "classpath:init-db.sql")

Web应用程序条件

@ConditionalOnWebApplication@ConditionalOnNotWebApplication注解允许根据应用是否是一个“web应用程序”被包括配置。

@Configuration
@ConditionalOnWebApplication
public class MyWebMvcAutoConfiguration {...}

SpEL表达条件

@ConditionalOnExpression注释允许基于SpeI位表达式的结果被包括配置。

@ConditionalOnExpression("${rest.security.enabled}==false")
2020-05-30