Phpunit使用服务测试方法

I'm trying to test a method which is using a service, and apparently it's not possible to test it like a normal method. Does someone know what to do ? I have this code for the moment :

namespace PlatformBundle\Tests;

use PlatformBundle\Controller\PaymentController;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;

class PaymentControllerTest extends WebTestCase
{
    private $payment;

    public function __construct() { parent::__construct(); $this->payment = new PaymentController(); }

    public function testSendEmail()
    {
        $param = array(
            'info' => array(
                'email' => 'test@test.com', 'name' => 'test', 'fare' => 'test', 'id' => 'test'
            )
        );
        $this->assertEquals(true, $this->invokeMethod($this->payment, 'sendEmail', $param));
    }

    /**
     * Call protected/private method of a class.
     *
     * @param object &$object    Instantiated object that we will run method on.
     * @param string $methodName Method name to call
     * @param array  $parameters Array of parameters to pass into method.
     *
     * @return mixed Method return.
     */
    public function invokeMethod(&$object, $methodName, array $parameters = array())
    {
        $reflection = new \ReflectionClass(get_class($object));
        $method = $reflection->getMethod($methodName);
        $method->setAccessible(true);

        return $method->invokeArgs($object, $parameters);
    }
}

The controller where the method sendEmail is :

<?php

namespace PlatformBundle\Controller;

use PlatformBundle\Entity\Customer;
use PlatformBundle\Entity\Promocode;
use PlatformBundle\Entity\Transfer;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\Config\Definition\Exception\Exception;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;

class PaymentController extends Controller
{
    public function checkoutAction(Request $req)
    {
        if (! $req->isMethod('POST')) throw new AccessDeniedHttpException();

        $info = $req->request->all();

        $this->container->get('platform.formSecurity')->testAllInformation($info);

        $this->saveCustomerIntoDb($info);

        $info['payed'] = false;
        $session = $req->getSession();
        $session->set('info', $info);

        $info['date'] = $this->container->get('platform.useful')->reverseDateFormat($info['date']);

        return $this->render('PlatformBundle:Payment:checkout.html.twig', array(
            'isIndex' => false,
            'info'    => $info,
            'stripe'  => $this->stripeConfig()
        ));
    }

    public function cancelAction(Request $req)
    {
        $req->getSession()->invalidate();
        return $this->render('PlatformBundle:Payment:cancel.html.twig', array('isIndex' => false));
    }

    public function successAction(Request $req)
    {
        $session = $req->getSession();
        $info    = $session->get('info');
        if ($info['payed']) {
            $req->getSession()->invalidate();

            if ($info === null) throw new Exception('Please contact us to make sure that the payment has been done and that your order has been taken into account.');

            $this->saveTransferIntoDb($info);

            $customer = $this->getDoctrine()->getManager()->getRepository('PlatformBundle:Customer')->findOneBy(array(
                'email' => $info['email']
            ));

            $transfer = $this->getDoctrine()->getManager()->getRepository('PlatformBundle:Transfer')->findOneBy(
                array('customer' => $customer->getId()),
                array('id' => 'desc'),
                1
            );

            $info['id'] = $transfer->getId();

            $info['date'] = $this->container->get('platform.useful')->reverseDateFormat($info['date']);

            $this->sendEmail($info);

            // if 5 payments done, send a promocode
            if (is_int($customer->getPayments() / 5)) {
                $this->createAndSendNewPromocode($customer);
            }

            return $this->render('PlatformBundle:Payment:success.html.twig', array(
                'isIndex' => false,
                'info'    => $info
            ));
        } else return new RedirectResponse('cancel');
    }

    private function sendEmail($info)
    {
        $mail = $this->container->get('platform.mail');
        $mail->send(
            $info['email'],
            'You have ordered a transfer for Dublin',
            $this->renderView('PlatformBundle:Mail:orderSucceed.html.twig', array('info' => $info)),
            'info@dubair.ie'
        );
        $mail->send(
            'info@airportcollections.net, info@dubair.ie, info@365onlineholidays.com',
            'A customer ordered a transfer for Dublin',
            $this->renderView('PlatformBundle:Mail:report.html.twig', array('info' => $info)),
            'info@dubair.ie'
        );
    }

    private function saveCustomerIntoDb($info)
    {
        // test if the customer already exist
        $customersList = $this->getDoctrine()->getManager()->getRepository('PlatformBundle:Customer')
            ->findByEmail($info['email']);

        $customerExists = (sizeof($customersList) == 1 ? true : false);
        if ($customerExists) {
            $customer = $customersList[0];
        } else {
            // Create the entity
            $customer = new Customer();
            // dateRegistration, country and ip are automatically created in the constructor
            $customer->setEmail($info['email']);
            $customer->setPayments(0);
        }
        $customer->setName($info['name']);
        $customer->setPhone($info['phone']);

        $em = $this->getDoctrine()->getManager();
        $em->persist($customer);
        $em->flush();
    }

    private function saveTransferIntoDb($info)
    {
        $customers = $this->getDoctrine()->getManager()->getRepository('PlatformBundle:Customer')
            ->findByEmail($info['email']);
        $customer = $customers[0];
        $customer->setPayments($customer->getPayments() + 1);

        // make promocode outdated
        if ($info['promocode'] != '') {
            $promocode = $this->getDoctrine()->getManager()->getRepository('PlatformBundle:Promocode')
                ->findOneBy(array(
                    'value'    => $info['promocode'],
                    'outdated' => 0,
                    'type'     => 'short'
                ));
            $promocode->setOutdated(1);
        }

        // test if transfer already exist
        $transferList = $this->getDoctrine()->getManager()->getRepository('PlatformBundle:Transfer')->findBy(
            array(
                'customer'    => $customer,
                'pickup'      => $info['pickup'],
                'destination' => $info['destination'],
                'pickupTime'  => $info['pickupTime'],
                'address'     => $info['address']
            ), // criteria
            array('pickup' => 'desc'),      // sorting
            5,                              // Limit
            0                               // Offset
        );

        // if transfer doesn't already exist, create it
        if (sizeof($transferList) == 0) {
            $transfer = new Transfer();
            $transfer->setPickup($info['pickup']);
            $transfer->setDestination($info['destination']);
            $dateArray = explode('-', $info['date']);
            $transfer->setDate(new \DateTime($dateArray[2].'-'.$dateArray[1].'-'.$dateArray[0]));
            $transfer->setAddress($info['address']);
            $transfer->setFlightTime($info['flightTime']);
            $transfer->setPickupTime($info['pickupTime']);
            $transfer->setSeats($info['seats']);
            $transfer->setAirline($info['airline']);
            $transfer->setFlight($info['flight']);
            $transfer->setType($info['type']);
            $transfer->setBags($info['bags']);
            $transfer->setFare($info['fare']);
            // join
            $transfer->setCustomer($customer);

            $em = $this->getDoctrine()->getManager();
            $em->persist($transfer);
            $em->flush();
        }
    }

    private function createAndSendNewPromocode($customer)
    {
        $newPromocode = $this->container->get('platform.useful')->createRandomPassword();
        $promocode = new Promocode();
        $promocode->setValue($newPromocode);
        $promocode->setType('short');
        $promocode->setDiscount(10);

        $em = $this->getDoctrine()->getManager();
        $em->persist($promocode);
        $em->flush();

        $mail = $this->container->get('platform.mail');
        $mail->send(
            $customer->getEmail(),
            'A promotional code for your next transfer on dubair.ie !',
            $this->renderView('PlatformBundle:Mail:promocode.html.twig', array(
                'customer'  => $customer,
                'promocode' => $newPromocode
            )),
            'info@dubair.ie'
        );
    }

    private function stripeConfig()
    {
        $stripe = array(
            "secret_key"      => "xx",
            "publishable_key" => "xx"
        );

        \Stripe\Stripe::setApiKey($stripe['secret_key']);

        return $stripe;
    }

    public function stripeChargeAction(Request $req)
    {
        $this->stripeConfig();

        $info = $req->getSession()->get('info');
        $amount = ($info['fare'] * 100);

        $info['payed'] = true;
        $req->getSession()->set('info', $info);

        $token = $req->request->get('stripeToken');

        $customer = \Stripe\Customer::create(array(
            'email' => $req->request->get('email'),
            'card'  => $token
        ));

        $charge = \Stripe\Charge::create(array(
            'customer' => $customer->id,
            'amount'   => $amount,
            'currency' => 'eur'
        ));

        return new RedirectResponse('success');
    }
}

thanks