public class Clock {
 
+       private static final DateTimeFormatter DD_MM_YYYY = DateTimeFormatter.ofPattern("dd/MM/yyyy");
+
        public String todayAsString() {
-               // We need to control this random stuff for our tests. :(
-               LocalDate today = LocalDate.now();
-               return today.format(DateTimeFormatter.ofPattern("dd/MM/yyyy"));
+               return today().format(DD_MM_YYYY);
+       }
+
+       // We isolated the randomness in here.
+       protected LocalDate today() {
+               return LocalDate.now();
        }
 
 }
 
 import static org.hamcrest.CoreMatchers.is;
 import static org.junit.Assert.assertThat;
 
+import java.time.LocalDate;
+
 import org.junit.Test;
 
 public class ClockShould {
 
        @Test public void
        return_todays_date_in_dd_MM_yyyy_format() {
-               Clock clock = new Clock();
+               Clock clock = new TestableClock();
                
                String date = clock.todayAsString();
                
                assertThat(date, is("04/12/2016"));
        }
 
+       private class TestableClock extends Clock {
+               
+               @Override
+               protected LocalDate today() {
+                       // We will control the random part of our code
+                       // (no need of using spy)
+                       return LocalDate.of(2016, 12, 4);
+               }
+       }
 }