Genymotion Java API
Sometimes, in your Android tests (formerly known as instrumented tests), you need to test what happens in your application when sensors return specific values.
As Android real devices cannot fake sensor values, you need to modify your source code to mock sensors and create proxy objects.
This adds unwanted noise into your project source code only useful for testing.
All sensors being already emulated inside Genymotion, the Genymotion Java API allows you to directly manipulate sensor values for your Android tests.
This section explains how to install and use Genymotion Java API.
Installing Genymotion Java API
To install Genymotion Java API, follow the steps corresponding to your build engine:
- Maven
- Gradle
- Other build systems
Maven
Add the Genymotion Java API repository to pom.xml:
<repository>
<id>genymotion</id>
<name>Genymotion repo</name>
<url>http://api.genymotion.com/repositories/releases/</url>
</repository>
<dependency>
<groupId>com.genymotion.api</groupId>
<artifactId>genymotion-api</artifactId>
<version>1.1.0</version>
</dependency>
Gradle
Add the Genymotion Java API repository to build.gradle:
repositories
{
maven
{
url "http://api.genymotion.com/repositories/releases/"
}
}
Add the dependency:
androidTestCompile 'com.genymotion.api:genymotion-api:1.1.0'
Add genymotion-api-1.1.0.jar file to the libs folder.
#### Other build systems
(No code block provided in the source for this section.)
### Using Genymotion Java API
To use the Genymotion Java API in your Android test project, follow the steps below:
1. Inside your Android test project, get a reference to the Genymotion object using:
GenymotionManager genymotion = Genymotion.getGenymotionManager
(getInstrumentation().getContext())
2. Access sensors from the GenymotionManager. For example, to set the battery charge level, use the command below:
genymotion.getBattery().setLevel(10);
This call freezes the application (10 seconds maximum) until the change is really effective.
You can find all available methods in Genymotion Java API Javadoc.
> Note
> Most of the time, your application listens to sensor changes using a listener, then updates the application interface. Genymotion Java API only freezes until sensor values are retrieved. To make sure your interface has had enough time to perform the update before testing it, you can add the following code snippet:
getInstrumentation().waitForIdleSync();
To make sure your Android test is only run inside Genymotion and not on a real device, you can exit the test by running the following command:
if (!GenymotionManager.isGenymotionDevice()) {
return; // don't execute this test
}
```
Examples
An application called Binocle showcases Genymotion Java API use. In this application, you can find activities for which the behavior depends on sensor values.
Here are some Android test examples built with Genymotion Java API to manipulate sensor values and check activity behaviors:
Battery
An application must display a warning message if the device is not plugged to a power source.
An application must display a warning message if the device has less than 10% of charge left.
- BatterySampleFragment.java
- TestBattery.java
GPS
An application must display a message if the device is localized near a specific place.
- GpsSampleFragment.java
- TestGps.java
Radio
An application must display a message if the device is a Nexus 4, as recognized by its IMEI number.
- RadioSampleFragment.java
- TestRadio.java
ID
An application must encrypt data using ANDROID_ID.
The purpose is to avoid backed up data being moved to another Android device.
- IdSampleFragment.java
- TestId.java
Phone
An application must display a green check mark when the virtual device receives a text message containing the text "666".
- PhoneSampleFragment.java
- TestPhone.java
For more information about the Binocle application, you can refer to Binocle source code.