Harry Kane scored the only goal of the game with a deft finish after pouncing on a disastrous pass by Marcello, who was trying to prevent a throw in, after 22 minutes.
Humiliated 7-3 last week by Atletico Madrid, Real could thank goalkeeper Keylor Navas, starting in place of injured Thibaut Courtois, for preventing a heavier against an enterprising and more aggressive Spurs team.
Madrid survived some goalmouth scares in the first half. After the break, Dele Alli went close twice and 17-year-old Troy Parrott hit the inside of the post.
Zinedine Zidane’s team have conceded 13 goals and lost three of their four warm-up games.
“We started off very badly, the opponent took advantage of our mistakes,” said Kroos.
With Gareth Bale, the source of turmoil in recent weeks, left out of the squad for the trip to Munich and James Rodriguez yet to start after returning from Bayern, Real rarely threatened. Star summer recruit Eden Hazard was invisible.
Both teams will be in action again tomorrow. Tottenham play the winner of the Tuesday’s second match, between Bayern and Fenerbahce. Real will have the opportunity to make amends tomorrow against the loser.
Zidane’s men then travel to Austria to face Salzburg on August 6, then to Italy for a match against AS Rome, the last friendly before the starting the Spanish league away to Celta Vigo on August 17.