Find the third largest element in the array in linear time
I think overall it is well done, it is clear and readable. Some general tips:


You can make the parameter a varargs, which makes it easier to call:

public static int findThirdLargest(int... numbers)
...
int thirdLargest = findThirdLargest(1, 2, 3);

Since you check for the size of the array, you could perhaps also check if it is not null.
This is somewhat personal, but I would always declare and initialise each variable on a separate line, e.g.:

int largest = Integer.MIN_VALUE;
int secondLargest = Integer.MIN_VALUE;
int thirdLargest= Integer.MIN_VALUE;



To me it helps readability and potentially refactoring later on.


I'd remove the newline after the for loop opener. It decreases readability for me.


Nice that you added tests! You covered some good cases. You could take a look at Hamcrest matchers, you can create some nice declarative tests with it. They can also show quite decent messages in case a test fails. 

Some extra tips about the current tests:


I'd split up the tests in a couple of different methods
Personally, I like to use static imports, so you can write:

assertEquals(1, findThirdLargest(1, 2, 3))

Also do not forget to test for failing cases. Test that when you pass less than 3 numbers, you expect an exception.


And what should the output of findThirdLargest(1, 1, 2, 2, 3, 3) be?

Lastly, a follow up exercise: how would you implement it if the user wants to find the k-th largest element?