Как обычно - придумать тестовые данные, после чего работать с ними. Зависимости, которые не имеют отношения к тестируемой логике напрямую можно замокать (в Java я использую Mockito, для вашего случая думаю тоже есть что то, упрощающее жизнь). В приведенном ниже примере возможно найдется что то полезное для вас.
import org.junit.Assert;
class Test {
public static void main(String[] args) {
String message = "Hello, World!\nCheck this message.";
ExternalController external = job -> {
System.out.println(job);
return job.toUpperCase();
};
InternalController tested = new InternalController(external);
String results = tested.processRequest(message);
Assert.assertEquals("HELLO, WORLD!\nCHECK THIS MESSAGE.\n", results);
}
}
class InternalController {
private ExternalController external;
InternalController(ExternalController external) {
this.external = external;
}
String processRequest(String message) {
String[] jobs = message.split("\n");
StringBuilder results = new StringBuilder();
for (String job : jobs) {
String result = external.doWork(job);
results.append(result).append("\n");
}
return results.toString();
}
}
interface ExternalController {
String doWork(String job);
}