Spring ServiceActivator在我的测试中定义时未执行

bzzcjhmw  于 2022-12-10  发布在  Spring
关注(0)|答案(1)|浏览(178)

我有以下出版类。

@Component
public class Publisher {

    @Autowired
    private MessageChannel publishingChannel;

    @Override
    public void publish(Event event) {
        publishingChannel.send(event);
    }
}

我有下面的测试类。

@RunWith(SpringRunner.class)
@SpringBootTest
public class PublisherTest {

    private final List<Event> events = new ArrayList<>();

    @Autowired
    private Publisher publisher;

    @Test
    public void testPublish() {
        Event testEvent = new Event("some_id_number");
        publisher.publish(testEvent);

        Awaitility.await()
             .atMost(2, TimeUnit.SECONDS)
             .until(() -> !this.events.isEmpty());
    }

    @ServiceActivator(inputChannel = "publishingChannel")
    public void publishEventListener(Event event) {
        this.events.add(event);
    }
}

消息通道bean在其他地方被示例化。发布者按预期运行,并且事件被发布到通道,但是服务激活器从未被调用。我在这里遗漏了什么?

7tofc5zh

7tofc5zh1#

事实证明,您需要将服务激活器移动到一个单独的测试组件类(@TestComponent防止它被注入到测试上下文之外)。

@TestComponent
public class TestListener {

    public final List<Object> results = new ArrayList<>();

    @ServiceActivator(inputChannel = "messageChannel")
    public void listener(Event event) {
        Object id = event.getHeaders().get("myId");
        results.add(id);
    }
}

然后,您可以将此侦听器引入到您的测试中。确保使用@Import将服务激活器类引入到测试上下文中。

@SpringBootTest
@Import(TestListener.class)
class PublisherTest {

    @Autowired
    private Publisher publisher;

    @Autowired
    private TestListener testListener;

    @Test
    void testPublish() {
        this.publisher.publish(new Event().addHeader("myId", 1));

        Awaitility.await()
            .atMost(2, TimeUnit.SECONDS)
            .until(() -> !this.testListeners.results.isEmpty());
    }
}

在做出这些更改后,测试通过。用一个演示应用程序解决了这个问题,并将其应用于生产测试问题。

相关问题