Как смоделировать ответы сетевого уровня для автоматизированного набора тестов Espresso пользовательского интерфейса Android Studio? - PullRequest
0 голосов
/ 12 мая 2019

Моя цель - запустить набор тестов пользовательского интерфейса Espresso и настроить экземпляр Retrofit, созданный в методе onCreate моей функции MainActivity, на возвращение ложных ответов JSON из localhost, поэтому я могу проверить, какПользовательский интерфейс приложения реагирует на коды ответов и другие данные JSON и т. д.

До сих пор я пытался добавить пакет MockWebServer и смог запустить его на сервере localhost.Однако экземпляр Retrofit все еще был настроен для производственного URL.

Я пытался передать аргументы при запуске теста, включая ручную настройку намерения для MainActivity с некоторыми extras, в попытке установить флаг, который мог бы переключать строку, используемую для экземпляра Retrofit,Однако, похоже, что любые аргументы, установленные в @Before теста, не обнаруживаются при запуске MainActivity.

Я посмотрел на эти ответы, но, похоже, решения не существует:

Тест пользовательского интерфейса Android Espresso с использованием модифицированного API Retrofit

Запрошенный сервер запрашивает тестирование пользовательского интерфейса Android Espresso

Это мой последний эксперимент:

@get:Rule
    var activityRule = ActivityTestRule(MainActivity::class.java, true, false)

    @Before
    fun setup() {

    }

    @Test
    fun intent() {
        val intent = Intent()

        activityRule.launchActivity(intent.putExtra("UITesting", true))

        println(activityRule.activity.intent.extras)
    }

Вот экземпляр Retrofit:

var BASE_URL = "https://api.invoicehome.com"

class NetworkManager {

    private val service : networkService
    // initialization with BASE_URL, using Gson converter factory to decode ( i believe there are other options available as well)
    init {
        val retrofit = Retrofit.Builder()
            .baseUrl(BASE_URL)
            .addConverterFactory(GsonConverterFactory.create())
            .build()
        service = retrofit.create(networkService::class.java)
//    }
    }
 }

Начало MainActivity, где есть экземпляр NetworkManager:

class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelectedListener {

    private var networkManager = NetworkManager()
}

. Я хотел бы что-то, что можно просто обернуть вокруг экземпляра Retrofit и вставить в URL, но я уверен на 99%это не реально.Если какие-то быстрые разработчики смотрят на это, я ищу аналогичную функциональность для Swifter.

Итак, могу ли я как-то сделать URL-адрес условным для экземпляра Retrofit?Где бы я пропустил эти флаги?Я скучаю по библиотеке, которая может сделать все это для меня?

1 Ответ

0 голосов
/ 12 мая 2019

Вы можете воспользоваться помощью библиотеки MockWebServer

Вам нужно будет абстрагировать свой класс NetworkManager и сделать две разные реализации, одну для насмешки над запросами, а другую для выполнения реальных запросов, и представить это как зависимость от вашей деятельности.

Так, например:

Интерфейс NetworkManager

interface NetworkManager {

    fun doRequest()
}

Макет реализации

class MockedNetworkManager : NetworkManager {

    override fun doRequest() {
        // Mock request
    }
}

Реальная реализация

class RealNetworkManager : NetworkManager {

    override fun doRequest() {
        // Real request
    }
}

А ваша MainActivity должна выглядеть примерно так

class MainActivity : AppCompatActivity() {

    private lateinit var networkManager: NetworkManager

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        val shouldMock = intent.getBooleanExtra("UITesting", false)
        if (shouldMock) {
            networkManager = MockedNetworkManager()
        } else {
            networkManager = RealNetworkManager()
        }
    }

}
...