Удаление @RunWith(AndroidJUnit4.class)
аннотаций из тестовых классов устранило проблему, хотя я не могу точно сказать, почему или как она это исправила.
Редактировать: Хорошо, я провел еще несколько испытаний.Я перенес свое приложение в Kotlin, и внезапно я заметил, что тесты также начали работать с аннотацией @RunWith
.Вот что я узнал:
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;
import androidx.test.ext.junit.runners.AndroidJUnit4;
@RunWith(AndroidJUnit4.class) // <-- @RunWith + @BeforeClass = Error
public class AndroidXJunitTestJava {
@BeforeClass
public static void setup() {
// Setting up once before all tests
}
@Test
public void testing() {
// Testing....
}
}
Этот Java-тест не пройден с ошибкой Delegate runner for AndroidJunit4 could not be loaded
.Но если я удаляю аннотацию @RunWith
, она работает.Кроме того, если я заменит настройку @BeforeClass
на @Before
, например:
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import androidx.test.ext.junit.runners.AndroidJUnit4;
@RunWith(AndroidJUnit4.class) // <-- @RunWith + @Before = works?
public class AndroidXJunitTestJava {
@Before
public void setup() {
// Setting up before every test
}
@Test
public void testing() {
// Testing....
}
}
Тесты будут выполняться без ошибок.Мне нужно было использовать аннотацию @BeforeClass
, поэтому я просто удалил @RunWith
.
Но теперь, когда я использую Kotlin, работает следующее (что должно быть равным первому примеру Java):
import androidx.test.ext.junit.runners.AndroidJUnit4
import org.junit.BeforeClass
import org.junit.Test
import org.junit.runner.RunWith
@RunWith(AndroidJUnit4::class)
class AndroidXJunitTest {
companion object {
@BeforeClass fun setup() {
// Setting up
}
}
@Test
fun testing() {
// Testing...
}
}
Также, как сказал Алессандро Биссек в ответе и @Ioane Sharvadze в комментариях, такая же ошибка может произойти с аннотацией @Rule
.Если я добавлю строку
@Rule val instantTaskExecutorRule = InstantTaskExecutorRule()
В пример Kotlin произойдет та же самая ошибка участника делегата.Это должно быть заменено на
@get:Rule val instantTaskExecutorRule = InstantTaskExecutorRule()
Пояснение здесь .