我如何验证使用Spring,Junit和Mockito发布了事件



我使用的是Spring 4.3.8. junit 4.12和Mockito 1.10.18。我有一个发布事件的服务...

@Service("organizationService")
@Transactional
public class OrganizationServiceImpl implements OrganizationService, ApplicationEventPublisherAware
            publisher.publishEvent(new ZincOrganizationEvent(id));
    @Override
    public void setApplicationEventPublisher(ApplicationEventPublisher publisher) 
    {
        this.publisher = publisher;
    }
    ...
    @Override
    public void save(Organization organization)
    {
    ...
    publisher.publishEvent(new ThirdPartyEvent(organization.getId()));

我的问题是,如何在Junit测试中验证事件实际上已经发布?

@Test
public void testUpdate()
{
m_orgSvc.save(org);
// Want to verify event publishing here

我更喜欢相反的方法,这是更多集成test-ey

  • 使用Mockito
  • 使用ApplicationListener
  • 🔗将模拟应用程序侦听器注册到ConfigurableApplicationContext
  • 工作
  • verify该模拟已收到事件

使用这种方法,您正在测试一个事件已通过某人收到的方式发布。

这是 Rudimental 身份验证测试的代码。除其他条件外,我测试是否发生了登录事件

@Test
public void testX509Authentication() throws Exception
{
    ApplicationListener<UserLoginEvent> loginListener = mock(ApplicationListener.class);
    configurableApplicationContext.addApplicationListener(loginListener);
    getMockMvc().perform(get("/").with(x509(getDemoCrt())))//
                .andExpect(status().is3xxRedirection())//
                .andExpect(redirectedUrlPattern("/secure/**"));
    getErrorCollector().checkSucceeds(() -> {
        verify(loginListener, atLeastOnce()).onApplicationEvent(any(UserLoginEvent.class));
        return null;
    });
}

我的建议是释放莫科托(Mockito(深入验证事件论点的力量。就我而言,我将把代码扩展到:

  • 检查登录事件中的用户名是否与身份验证的主体
  • 匹配
  • 执行用户公然未能登录的其他测试,我希望各种登录失败事件之一

如果要测试如果您不忘记在OrganizationServiceImpl内调用publishEvent方法,则可以使用类似的东西:

class OrganizationServiceImplTest {
    private OrganizationServiceImpl organizationService;
    private ApplicationEventPublisher eventPublisher;
    @Before
    public void setUp() {
        eventPublisher = mock(ApplicationEventPublisher.class);
        organizationService = new OrganizationServiceImpl();
        organizationService.setApplicationEventPublisher(eventPublisher)
    }
    @Test
    public void testSave() {
        /* ... */
        organizationService.save(organization);
        verify(eventPublisher).publishEvent(any(ThirdPartyEvent.class));
    }
}

上面的测试用例将验证是否有publishEvent方法的调用。

有关更多检查文档。

关于:

我的问题是,如何在Junit测试中验证事件实际上已经发布?

您必须测试ApplicationEventPublisher实现,如果要验证实际发送的情况。

相关内容

  • 没有找到相关文章

最新更新