However, when I click on the old url result in Google, I am redirected to the homepage, not the new url.
Does Google not pick up on 301 redirects in the actual SERPs? Will they still know to index the new URL in lieu of the old one?
Google does not do redirects, your server does. So, clicking on URL from Google SERPs would send a request to your server. Your server will respond with 301 and the new location for this URL.
Firstly, are you sure that the URL in SERPs is the "old" URL? Sometimes, immediately after redirects are implemented, the Title/description shown in SERPs may be from the "old" URL, but the actual URL is the new URL (or perhaps the home page) - and it may take some time for this to settle to the correct Title/description.
So it could be that your Title/Description in SERPs are shown from the "old" page, but the URL in SERPs is from the home page.
Hovering over the page title whilst in SERPs and checking the URL in the status bar of the browser may give you the information which URL will Google request. Note that this URL may not be always the same as the URL that is shown in green below the Title in SERPs.
Even better, to fully understand what is happening, you would need to check request/response using a tool such as FireFox Live HTTP headers. Here you could see what was in fact requested and how did your server responded, and if it was 301, what was the "location" of the redirect.
I doubt that your server responded to Google with the location of the new page and Google decided to show the home page instead!
However, if the request was in fact for the "old" URL and your server responded with 301 with location being the home page, then you should check whether on your server you are doing something specific (perhaps based on referer).