@Override
    public Single<byte[]> readCharacteristic(@NonNull final BluetoothGattCharacteristic characteristic) {
        final RxBleCharacteristicReadCallback readCallback = characteristicReadCallbacks.get(characteristic.getUuid());
        if (readCallback == null) {
            return Single.just(characteristic.getValue());
        }
        return Single.just(characteristic).flatMap(new Function<BluetoothGattCharacteristic, SingleSource<? extends byte[]>>() {
            @Override
            public SingleSource<? extends byte[]> apply(final BluetoothGattCharacteristic characteristic) throws Exception {
                final SingleSubject<byte[]> subj = SingleSubject.create();
                readCallback.handle(deviceMock, characteristic, new RxBleGattReadResultMock() {
                    @Override
                    public void success(byte[] data) {
                        characteristic.setValue(data);
                        subj.onSuccess(data);
                    }

                    @Override
                    public void failure(int status) {
                        subj.onError(
                                new BleGattCharacteristicException(null,
                                        characteristic,
                                        status,
                                        BleGattOperationType.CHARACTERISTIC_READ)
                        );
                    }

                    @Override
                    public void disconnect(int status) {
                        subj.onError(handleDisconnection(status));
                    }
                });
                return subj;
            }
        }).doOnSuccess(new Consumer<byte[]>() {
            @Override
            public void accept(byte[] bytes) throws Exception {
                characteristic.setValue(bytes);
            }
        });
    }
Value used to disable notifications or indicatinos
mockrxandroidble/src/main/java/com/polidea/rxandroidble2/mockrxandroidble/RxBleConnectionMock.java