对于我的 Android 应用程序,我使用 Realm 移动数据库。我想为此编写测试,我发现的最好的测试方法是使用仪器测试。
这是我的数据库类的构造函数:
public Database(Context context) {
this.context = context.getApplicationContext();
Realm.init(context);
RealmConfiguration realmConfig = new RealmConfiguration.Builder()
.name("com.arnowouter.badger.realmdatabase") // TODO: 4/10/2016 check if encryptable
.build();
realm = Realm.getInstance(realmConfig);
}
Run Code Online (Sandbox Code Playgroud)
如您所见,调用了 Realm.init(context)。但是当我运行这个测试时:
@RunWith(AndroidJUnit4.class)
@MediumTest
public class DatabaseTest {
Database database;
Context context;
@Before
public void setupDatabase() {
context = InstrumentationRegistry.getContext();
database = new Database(context);
}
}
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
java.lang.IllegalStateException: Call `Realm.init(Context)` before creating a RealmConfiguration
at io.realm.RealmConfiguration$Builder.<init>(RealmConfiguration.java:399)
at io.realm.RealmConfiguration$Builder.<init>(RealmConfiguration.java:394)
at com.arnowouter.badger.Database.Database.<init>(Database.java:38)
at com.arnowouter.badger.DatabaseTest.setupDatabase(DatabaseTest.java:27)
at java.lang.reflect.Method.invoke(Native Method)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) …Run Code Online (Sandbox Code Playgroud) 我正在从GCM切换到FCM.我只用它通过FCM向我的服务器发送消息.我扩展FirebaseMessagingService到实现回调.例如,onSendError()工作正常,但onMessageSent()永远不会执行...我不知道它是否相关,但是当收到消息时,我从我的服务器发送'ack'节.
我的FirebaseMessegingService类:
public class FCMListenerService extends FirebaseMessagingService {
public FCMListenerService() {
super();
}
@Override
public void onDeletedMessages() {
Log.d("wouter", "onDeletedMessages: ");
super.onDeletedMessages();
}
@Override
public void onMessageSent(String msgID) {
Log.e("wouter", "##########onMessageSent: " + msgID );
super.onMessageSent(msgID);
Database database = new Database(this);
database.confirmFCMMessageSend(msgID);
database.closeDatabase();
}
@Override
public void onSendError(String msgID, Exception exception) {
Log.e("wouter", "onSendError ", exception );
super.onSendError(msgID, exception);
Database database = new Database(this);
database.eraseFCMMsgIDFromFGMMessageLog(msgID);
database.closeDatabase();
}
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
super.onMessageReceived(remoteMessage); …Run Code Online (Sandbox Code Playgroud) 我将以一个代码示例开始;我必须测试一个处理数据包的功能。在此函数中,数据包被打开,并且当它不包含所有预期数据时,将引发InvalidParameterExeption并记录下来。
public void handleData(dataPacket) {
try {
analyseData(dataPacket);
} catch (InvalidParameterException e) {
e.printStackTrace()
}
}
Run Code Online (Sandbox Code Playgroud)
因此,如果一切顺利,则我的异常会打印在终端中。但是我该如何测试呢?我不能使用这个:(因为捕获到异常)
@Test(expected = InvalidParameterExeption.class)
public void testIfFaultyDataPacketIsRecognised {
handleData(faultyDataPacket);
}
Run Code Online (Sandbox Code Playgroud)
如何测试抛出InvalidParameterExeption?