I'm currently learning about TDD techniques, one of the suggestion is to test only public methods and skip the private ones
Yes, TDD focuses the efforts on defining the test through the contract first and getting the implementation later. We define first the methods (mostly public), their arguments, their returning types and the exceptions that can be thrown.
These contracts might or might not come from interfaces
or virtual methods
. They could be mere empty methods of a new class. So, no, they don't all come from an interface. TDD will not force your design in that way. 1
I have also been reading about Mocking
Here is where you are getting lost. Mocks (IMO) are an advanced technique for testing. Not directly involved with TDD. You can still follow TDD with no mocks. Mocks are addressed for testing components with heavy dependencies (as @guillamue31 commented in his answer). it provides a "fake" instance of a given interface. One which behaviour can be programmed in order to meet the conditions required for the use case under test. It could be a class too. Yes, concrete classes can be mocked too.
When I start developing my application I don't know which methods I
will want to mock while creating unit tests, because of that I think
it's best to make them all available for mocking.
Fine. Let TDD tell which components are good candidates to be mocked. After several iterations of TDD, once tests go green, it's easier to see which components need decoupling and therefore, the candidates to be mocked. But keep in mind that not every single dependency implies an interface. That's up to you to decide based on the requirements, needs and preferences.
1: I would like to share a video of Sandro Mancuso implementing Rovers Mars kata. You will see that he didn't use any interface to test contracts. Mancuso is very in favour of this methodology and he encourages it to all his employees
2: Note that Sandro is following TDD and Rover's methods are protected!!! He is playing with the package scope. Test and concrete class are in the same package. So, TDD doesn't even force us to define methods as public.