2017-05-26 73 views
1

尝试为Realm创建Junit测试,但我似乎难以正确设置它。我不确定我是否应该异步运行它,我的直觉说不。Junit在Android上测试Realm。无法在未调用Looper.prepare()的线程中创建处理程序

在运行时,我得到了日益流行的错误:

05-26 16:03:32.561 14131-14148/? I/TestRunner: started: aCreateNewPlayer(com.example.gideonsassoon.avariel.RealmTest) 
05-26 16:03:32.567 14131-14148/? E/Exception: RealmException Can't create handler inside thread that has not called Looper.prepare() 
05-26 16:03:32.568 14131-14148/? W/System.err:  at com.example.gideonsassoon.avariel.database.RealmManager.<init>(RealmManager.java:20) 
05-26 16:03:32.568 14131-14148/? W/System.err:  at com.example.gideonsassoon.avariel.RealmTest.aCreateNewPlayer(RealmTest.java:40) 
05-26 16:03:32.569 14131-14148/? I/TestRunner: finished: aCreateNewPlayer(com.example.gideonsassoon.avariel.RealmTest) 

这是它承载和运行一切为我RealmManager类的代码。

package com.example.gideonsassoon.avariel.database; 

import android.app.Activity; 
import android.os.Bundle; 

import com.example.gideonsassoon.avariel.datamodels.Player; 
import com.example.gideonsassoon.avariel.ui.MainFragmentActivity; 
import com.facebook.stetho.Stetho; 
import com.uphyca.stetho_realm.RealmInspectorModulesProvider; 

import io.realm.Realm; 
import io.realm.RealmConfiguration; 
import io.realm.RealmQuery; 
import io.realm.RealmResults; 

/** 
* Created by Gideon Sassoon on 16/05/2017. 
*/ 
public class RealmManager extends Activity { 

    public static final String TAG = MainFragmentActivity.class.getName(); 
    private Realm realm; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     //Looper.prepare(); 
     realm = Realm.getDefaultInstance(); 
     /** 
     * https://realm.io/docs/java/latest/#getting-started 
     * http://facebook.github.io/stetho/ 
     * https://github.com/uPhyca/stetho-realm 
     * chrome://inspect/#devices 
     */ 
     Stetho.initializeWithDefaults(this); 
     Realm.init(this); 
     Stetho.initialize(
       Stetho.newInitializerBuilder(this) 
         .enableDumpapp(Stetho.defaultDumperPluginsProvider(this)) 
         .enableWebKitInspector(RealmInspectorModulesProvider.builder(this).build()) 
         .build()); 

     super.onCreate(savedInstanceState); 
     Realm.init(this); 

     RealmConfiguration config = new RealmConfiguration.Builder().build(); 
     Realm.setDefaultConfiguration(config); 
    } 

    @Override 
    protected void onDestroy() { 
     super.onDestroy(); 
     realm.close(); 
    } 

    public void savePlayer(Player player) { 
     Player player2 = realm.copyToRealm((player)); 
    } 
    public void queryPlayer(String key, String value){ 
     // https://realm.io/docs/java/latest/#queries 
     RealmQuery<Player> query = realm.where(Player.class); 
     query.equalTo("playerName","Gideon"); 
     query.or().equalTo(key, value); 
     RealmResults<Player> result1 = query.findAll(); 
     realm.executeTransaction(new Realm.Transaction() { 
      @Override 
      public void execute(Realm realm) { 
       Player player = realm.createObject(Player.class); 
       player.setCurrentHP(26); 
       player.setAlignment("Lawful Evil"); 
      } 
     }); 
     //Player player = result1.where().equalTo(key, value).or().equalTo("playerName", "Gideon").findFirst(); 
    } 
} 

这是它运行的代码

package com.example.gideonsassoon.avariel; 

import android.support.test.runner.AndroidJUnit4; 
import android.util.Log; 

import com.example.gideonsassoon.avariel.database.RealmManager; 
import com.example.gideonsassoon.avariel.datamodels.Player; 

import junit.framework.TestCase; 

import org.junit.BeforeClass; 
import org.junit.FixMethodOrder; 
import org.junit.Test; 
import org.junit.runner.RunWith; 
import org.junit.runners.MethodSorters; 

/** 
* Created by Gideon Sassoon on 21/05/2017. 
*/ 
@RunWith(AndroidJUnit4.class) 
@FixMethodOrder(MethodSorters.NAME_ASCENDING) 

public class RealmTest extends TestCase { 

    RealmManager realmManager; 
    Player player; 
    Player actualPlayerResult; 
    String actualStringResult; 
    long actualLongResult; 

    @BeforeClass 
    public static void setup() { 
     System.out.println("Before Start /r/n, Welcome to the Doom Room!"); 
     Log.i("TEST_START", "Before Start /r/n, Welcome to the Doom Room!"); 
    } 

    @Test 
    public void aCreateNewPlayer() { 
     try { 
      realmManager = new RealmManager(); 
      player = new Player(); 
      player = player.create(01, "Gideon", "Barlock", "Orc", "Lawful Evil", "Fighter", "A wandering Warrior", 0, 30, 0, null, null, null, null, null, null, null, null, null, 0); 
      realmManager.savePlayer(player); 
      Log.i("REALM", realmManager.toString()); 
     } catch (Exception e) { 
      // Sep 12, 2013 6:50:17 AM 
      Log.e("Exception", "RealmException " + String.valueOf(e.getMessage())); 
      e.printStackTrace(); 
     } 
    } 

    @Test 
    public void bGetPlayer() { 
     //actualPlayerResult = Result here; 
     realmManager.queryPlayer("playerName", "Gideon"); 
     Log.i("REALM Test getPlayer", "Our player's name is: " + actualPlayerResult.getName()); 
    } 

    public void cPlacePlayerInApp() { 


    } 
} 

如果你想看到这个项目无论出于何种原因的其余部分我的JUnit测试类。

You are more than welcome to do so here :)

+0

如果能帮到您,请您接受答案吗? –

回答

0

你得到这个错误的原因是因为你是通过调用构造函数在这条线在这里初始化你的活动(RealmManager)的子类:

realmManager = new RealmManager(); //won't work because RealmManager is an Activity 

虽然活动,片段和服务具有无参数构造函数,它们被设计为由OS实例化,仅调用构造函数不足以获得全功能实例。

写的仪表单元测试(即您在Android手机上运行单元测试)现在是按照正确的成语:

@RunWith(AndroidJUnit4.class) 
public class RealmManagerTest { //no need to extend TestCase here!!!! 

    public ActivityTestRule<RealmManager> activityRule = new ActivityTestRule<>(RealmManager.class); 

    RealmManager realmManager; 

    @Before 
    public void setUp() throws Exception { 
     activityRule.launchActivity(null); 
     realmManager = activityRule.getActivity(); 
    } 

的ActivityRule将正确实例化的活动为你的将执行onCreate()onResume()的回调,并根据需要准备活套。请注意,您不再需要延长TestCase。有关仪器化单元测试的更多信息,请参阅the official docs

+0

不幸的是,Realm目前还不支持Robolectric。 – Dalinaum

+0

@Dalinaum我的坏 - 更新了答案 –

相关问题