Service-oriented applications are usually composed of services from different organizations. To protect the business interests of service providers, the implementation details of services are usually invisible to service consumers. This makes it challenging to white-box test service-oriented applications because of the difficulty to determine accurately the test coverage of a service composition as a whole and the difficulty to design test cases effectively. To address this problem, we propose an approach to white-box test service compositions based on events exposed by services. By deriving event interfaces to explore test coverage information from service implementations, our approach allows service consumers to determine accurately test coverage during testing based on events exposed by services at runtime. We also develop an approach to design test cases effectively based on services' event interfaces. The experimental results show that our approach outperforms existing testing approaches for service compositions with 35% more test coverage rate, 19% more fault-detection rate and 80% fewer test cases needed.