我使用的是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 使用
- 🔗将模拟应用程序侦听器注册到
ConfigurableApplicationContext
- 工作
- verify该模拟已收到事件
ApplicationListener
使用这种方法,您正在测试一个事件已通过某人收到的方式发布。
这是 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
实现,如果要验证实际发送的情况。