Моего класс делает это:Robolectric тест должен ждать чего-то на нитке
public void doThing() {
Doer doer = new Doer();
Thread thread = new Thread(doer);
thread.start();
}
класса «делатель» является внутренним классом:
private class Doer implements Runnable {
public void run() {
Intent myIntent = new Intent(mContext, MyService.class);
mContext.startService(myIntent);
...Some more stuff...
}
Это прекрасно работает.
Мне нужно проверить это с помощью Robolectric. Естественно doThing()
возвращается немедленно, и мне нужно, чтобы дать нить возможность работать, прежде чем я
ShadowApplication.getInstance().getNextStartedService()
Как я могу ждать нить бежать?
Я попробовал:
Robolectric.flushForegroundThreadScheduler();
Robolectric.flushBackgroundThreadScheduler();
и ни к желаемому эффекту: они оба до моего возвращения Intent было отправлено.
В настоящее время я работал вокруг него, поставив сон в мой тест:
Thread.sleep(10);
и это делает трюк, но это явно ужасно - это состояние гонки ждет, чтобы причинить мне горе.
Почему вы используете класс Thread вместо оболочки, такой как класс AsyncTask? У Robolectric уже есть механизм, позволяющий избежать параллельного выполнения кода при использовании AsyncTask. 'Robolectric.flushBackgroundThreadScheduler()' может иметь эффект только при использовании механизма, который можно легко затенять robolectric, например AsyncTask. – nenick
Поскольку мне нужно было передать нагрузку параметров (не показано в моем фрагменте), а реализация Thread была проще для того, что мне нужно было сделать ... Однако я думаю, что вы правы, преимущества выигрыша ShadowAsyncTask - и вот что я использовал. –