public void ParallelAccessHandlingMessagesWithRealValidator() { // arrange var receivedMessages = new LinkedList <Message>(); var messageValidator = new MessageValidator(); var messageLoader = new Mock <IMessageLoader>(MockBehavior.Strict); var message1 = new Message(1, "message1"); var message1A = new Message(1, "message1a"); var message2 = new Message(2, "message2"); // act var messageHandler = new MessageHandler((channel, msg) => { receivedMessages.AddLast(msg); Thread.Sleep(10 * (int)msg.Id); }); var messageProcessor = new MessageProcessor( "test-channel", messageValidator, messageLoader.Object, messageHandler); var messages = new[] { message1A, message2 }; messageLoader.Setup(_ => _.GetMessages("test-channel", It.IsAny <long>(), long.MaxValue)) .Returns(messages); messageProcessor.ProcessMessage(message1, "test-channel"); ThreadPool.QueueUserWorkItem(state => messageProcessor.ProcessMessage(message1, "test-channel")); Thread.Sleep(1); ThreadPool.QueueUserWorkItem(state => messageProcessor.CheckForMissedMessages()); Thread.Sleep(100); // assert Assert.Equal(2, receivedMessages.Count); Assert.Collection( receivedMessages, m => { Assert.Equal(1, m.Id); Assert.Equal("message1", m.Content); }, m => Assert.Equal(2, m.Id)); }