【问题标题】:why can't my spring-cloud-stream mockito test Autowire my Processor?为什么我的 spring-cloud-stream mockito 不能测试 Autowire 我的处理器?
【发布时间】:2019-06-03 07:32:08
【问题描述】:

我正在尝试为我的 spring-cloud-stream 项目创建测试。我创建了自己的 BizSyncProcessor 接口,而不是使用默认处理器,这似乎在所有文档中。我以前用测试做过这种项目,但不记得我是否同时使用了 mockito,所以我想知道这是否是问题所在,因为我正在做 @RunWith(MockitoJUnitRunner.class) 而不是@RunWith(SpringRunner)。

在我将 rabbit 实现作为依赖项包含在 maven 中之前,我也有 similar problems when building the actual app

IntelliJ 在@Autowired BizSyncProcessor 上标记一个错误,指出“找不到‘BizSyncProcessor’类型的 Bean。但是我可以运行测试,所以它可以编译,但是运行测试时 bizSyncProcessor 为空。

我包含 mockito 是因为侦听消息的处理程序调用另一个服务(SFISClient),所以我正在模拟该调用。

这是我的测试:

@RunWith(MockitoJUnitRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@EnableAutoConfiguration
@Configuration
@EnableBinding(BizSyncProcessor.class)
public class UpdatedBusinessHandlerTest {

    @Autowired
    private BizSyncProcessor bizSyncProcessor;

    @Autowired
    private MessageCollector messageCollector;

    @Mock
    SFISClient sfisClient;

    @InjectMocks
    UpdatedBusinessHandler updatedBusinessHandler;

    @Test
    public void testWiring() throws Exception {
        UpdatedBusinessAlert updatedBusinessAlert = new UpdatedBusinessAlert();
        updatedBusinessAlert.setBusinessId(UUID.randomUUID());
        Message<UpdatedBusinessAlert> updatedBusinessAlertMessage = MessageBuilder.withPayload(updatedBusinessAlert).build();
        bizSyncProcessor.writeUpdatedBusinessIds().send(updatedBusinessAlertMessage);

        Message<BusinessFlooringSummary> businessFlooringSummaryMessage = (Message<BusinessFlooringSummary>) messageCollector.forChannel(bizSyncProcessor.writeFlooringSummaries()).poll();
        BusinessFlooringSummary businessFlooringSummary = businessFlooringSummaryMessage.getPayload();
        assertNotNull(businessFlooringSummary);
    }
}

【问题讨论】:

    标签: mockito spring-cloud-stream


    【解决方案1】:

    @SpringBootTest 和所有基于 Spring 的东西都不适用于您的情况,因为您不使用 @RunWith(SpringRunner)。没有什么可以触发那些 Spring 钩子。

    另一方面,没有理由使用MockitoJUnitRunner。您只需依靠@MockBean 代替您的SFISClienthttps://docs.spring.io/spring-boot/docs/2.1.1.RELEASE/reference/htmlsingle/#boot-features-testing-spring-boot-applications-mocking-beans

    【讨论】:

    • 谢谢;我错误地认为 MockitoJUnitRunner 扩展了 SpringRunner,或者以某种方式引入了基本的 Spring 上下文;我错了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-26
    • 1970-01-01
    • 2018-01-02
    相关资源
    最近更新 更多