{% setvar book_path %}/reference/androidx/_book.yaml{% endsetvar %} {% include "_shared/_reference-head-tags.html" %}

ServiceTestRule

public class ServiceTestRule


A JUnit rule that provides a simplified mechanism to start and shutdown your service before and after the duration of your test. It also guarantees that the service is successfully connected when starting (or binding to) a service. The service can be started (or bound) using one of the helper methods. It will automatically be stopped (or unbound) after the test completes and any methods annotated with After are finished.

Note: This rule doesn't support android.app.IntentService because it's automatically destroyed when onHandleIntent finishes all outstanding commands. So there is no guarantee to establish a successful connection in a timely manner.

Usage:

@Rule
public final ServiceTestRule mServiceRule = new ServiceTestRule();

@Test
public void testWithStartedService() {
    mServiceRule.startService(
        new Intent(InstrumentationRegistry.getTargetContext(), MyService.class));
    //do something
}

@Test
public void testWithBoundService() {
    IBinder binder = mServiceRule.bindService(
        new Intent(InstrumentationRegistry.getTargetContext(), MyService.class));
    MyService service = ((MyService.LocalBinder) binder).getService();
    assertTrue("True wasn't returned", service.doSomethingToReturnTrue());
}

This API is currently in beta.

Summary

Public constructors

Creates a ServiceTestRule with a default timeout of 5 seconds

Public methods

@NonNull Statement
apply(@NonNull Statement base, @NonNull Description description)
@NonNull IBinder
bindService(@NonNull Intent intent)

Works just like bindService except uses an internal android.content.ServiceConnection to guarantee successful bound.

@NonNull IBinder
bindService(
    @NonNull Intent intent,
    @NonNull ServiceConnection connection,
    @NonNull int flags
)

Binds the service under test, in the same way as if it were started by Context.bindService(Intent, ServiceConnection, flags) with an android.content.Intent that identifies a service.

@NonNull void
startService(@NonNull Intent intent)

Starts the service under test and blocks until the service is connected, in the same way as if it were started by Context.startService(Intent) with an android.content.Intent that identifies a service.

@NonNull void

Unbinds the service under test that was previously bound by a call to or bindService.

static @NonNull ServiceTestRule
withTimeout(@NonNull long timeout, @NonNull TimeUnit timeUnit)

Factory method to create a ServiceTestRule with a custom timeout

Public constructors

ServiceTestRule

public ServiceTestRule()

Creates a ServiceTestRule with a default timeout of 5 seconds

Public methods

apply

@NonNull
public Statement apply(@NonNull Statement base, @NonNull Description description)

bindService

@NonNull
public IBinder bindService(@NonNull Intent intent)

Works just like bindService except uses an internal android.content.ServiceConnection to guarantee successful bound. The operation option flag defaults to BIND_AUTO_CREATE

See also
bindService

#bindService(android.content.Intent, android.content.ServiceConnection, int)

bindService

@NonNull
public IBinder bindService(
    @NonNull Intent intent,
    @NonNull ServiceConnection connection,
    @NonNull int flags
)

Binds the service under test, in the same way as if it were started by Context.bindService(Intent, ServiceConnection, flags) with an android.content.Intent that identifies a service. However, it waits for onServiceConnected to be called before returning.

Parameters
@NonNull Intent intent

Identifies the service to connect to. The Intent may specify either an explicit component name, or a logical description (action, category, etc) to match an published by a service.

@NonNull ServiceConnection connection

Receives information as the service is started and stopped. This must be a valid ServiceConnection object; it must not be null.

@NonNull int flags

Operation options for the binding. May be 0, , , , , , or .

Returns
IBinder

An object whose type is a subclass of IBinder, for making further calls into the service.

Throws
java.lang.SecurityException

if the called doesn't have permission to bind to the given service.

java.util.concurrent.TimeoutException

if timed out waiting for a successful connection with the service.

See also
Context

android.content.Context#BIND_AUTO_CREATE

Context

android.content.Context#BIND_DEBUG_UNBIND

Context

android.content.Context#BIND_NOT_FOREGROUND

startService

@NonNull
public void startService(@NonNull Intent intent)

Starts the service under test and blocks until the service is connected, in the same way as if it were started by Context.startService(Intent) with an android.content.Intent that identifies a service. If you use this method to start the service, it is automatically stopped at the end of the test run. However, it also attempts to bind to the service and waits for onServiceConnected to be called to ensure successful connection.

Note: This method only supports services that allow clients to bind to them. In other words, if your service onBind method returns null then a TimeoutException will be thrown.

Parameters
@NonNull Intent intent

An Intent that identifies a service, of the same form as the Intent passed to Context.startService (Intent).

Throws
java.lang.SecurityException

if you do not have permission to bind to the given service.

java.util.concurrent.TimeoutException

if timed out waiting for a successful connection with the service.

unbindService

@NonNull
public void unbindService()

Unbinds the service under test that was previously bound by a call to or bindService. You normally do not need to call this method since your service will automatically be stopped and unbound at the end of each test method.

withTimeout

@NonNull
public static ServiceTestRule withTimeout(@NonNull long timeout, @NonNull TimeUnit timeUnit)

Factory method to create a ServiceTestRule with a custom timeout

Parameters
@NonNull long timeout

the amount of time to wait for a service to connect.

@NonNull TimeUnit timeUnit

the time unit representing how the timeout parameter should be interpreted

Returns
ServiceTestRule

a ServiceTestRule with the desired timeout