Here is the MWE:
\documentclass{minimal}
% \usepackage{lipsum}
% \let\uline\underline
\usepackage{ulem}
\newif\ifanswer
\newcommand{\showanswer}[0]{\answertrue}
\newcommand{\hideanswer}[0]{\answerfalse}
\newcommand{\answer}[1]{
\ifanswer{#1}\else\hphantom{#1}\fi
}
\newcommand{\fillin}[1]{%
\uline{\hspace{0.5em}\answer{#1}\hspace{0.5em}}}
\begin{document}
Test0:
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Ut purus elit, \uline{vestibulum ut, placerat ac,adipiscing vitae, felis}. Curabitur dictum gravida mauris. Nam arcu libero, nonummy eget, consectetuerid, vulputate a, magna.
\showanswer
Test1-1:
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Ut purus elit, \fillin{vestibulum ut, placerat ac,adipiscing vitae, felis}. Curabitur dictum gravida mauris. Nam arcu libero, nonummy eget, consectetuerid, vulputate a, magna.
Test1-2:
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Ut purus elit, \uline{\hspace{0.5em}\ifanswer{vestibulum ut, placerat ac,adipiscing vitae, felis}\fi\hspace{0.5em}}. Curabitur dictum gravida mauris. Nam arcu libero, nonummy eget, consectetuerid, vulputate a, magna.
Test1-3:
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Ut purus elit, \hspace{0.5em}\ifanswer\uline{vestibulum ut, placerat ac,adipiscing vitae, felis}\fi\hspace{0.5em}. Curabitur dictum gravida mauris. Nam arcu libero, nonummy eget, consectetuerid, vulputate a, magna.
Test1-4:
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Ut purus elit, \hspace{0.5em}\ifanswer\uline{vestibulum ut, placerat ac,adipiscing vitae, felis}\else\uline{\hphantom{vestibulum ut, placerat ac,adipiscing vitae, felis}}\fi\hspace{0.5em}. Curabitur dictum gravida mauris. Nam arcu libero, nonummy eget, consectetuerid, vulputate a, magna.
\hideanswer
Test2-1:
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Ut purus elit, \fillin{vestibulum ut, placerat ac,adipiscing vitae, felis}. Curabitur dictum gravida mauris. Nam arcu libero, nonummy eget, consectetuerid, vulputate a, magna.
Test2-2:
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Ut purus elit, \uline{\hspace{0.5em}\ifanswer{vestibulum ut, placerat ac,adipiscing vitae, felis}\fi\hspace{0.5em}}. Curabitur dictum gravida mauris. Nam arcu libero, nonummy eget, consectetuerid, vulputate a, magna.
Test2-3:
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Ut purus elit, \hspace{0.5em}\ifanswer\uline{vestibulum ut, placerat ac,adipiscing vitae, felis}\fi\hspace{0.5em}. Curabitur dictum gravida mauris. Nam arcu libero, nonummy eget, consectetuerid, vulputate a, magna.
Test2-4:
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Ut purus elit, \hspace{0.5em}\ifanswer\uline{vestibulum ut, placerat ac,adipiscing vitae, felis}\else\uline{\hphantom{vestibulum ut, placerat ac,adipiscing vitae, felis}}\fi\hspace{0.5em}. Curabitur dictum gravida mauris. Nam arcu libero, nonummy eget, consectetuerid, vulputate a, magna.
\end{document}
Edit 1:
After some searching, the question Phantom and line break may explain the reason but without a satisfactory solution.

\hphantombuilds a box that cannot be split across lines. – egreg Sep 26 '19 at 10:34