Android测试只为测试创建方法

时间:2018-05-30 20:43:20

标签: android firebase android-espresso android-testing

我正在尝试使用JUnit和espresso构建活动测试。

但是我遇到了一个问题。我的活动取决于之前应该从数据库加载用户数据的活动。

我将用户数据存储在私有变量中(以防止任何不必要的更改)以及向其应用值的唯一方法是使用loadFromDatabase方法。

但是我在测试时不能使用这个方法,因为它有一个回调监听器(它向服务器发送请求),我需要立即加载这些数据以加载活动

public User {
    private static User mCurrentUser = ...;

    public static void loadFromDatabase() { ... }
}


public MainActivityTest {

   public MainActivityTest() {
       // load the data                   
       User.loadFromDatabase({
          // on complete callback
       })

       // load the activity
       activity = new ActivityTestRule(MainActivity.class)
   }

}

public MainActivity extends Activity {

  public void onCreate() {
      // needs the user data
      User.mCurrentUser...
  }

}

如何在不公开mCurrentUser的情况下处理此类问题?

有没有办法在常规类中创建方法只是为了测试?

感谢。

1 个答案:

答案 0 :(得分:0)

你可以嘲笑它。对于模拟,你可以使用像Mockito&amp ;;这样的模拟库。 PowerMockito

在User中创建一个方法以返回值并模拟该方法。如果您希望此方法专门用于测试,则使用@VisibleForTesting标记它以限制对它的访问。 例如;

public class User{
  private static User mCurrentUser;
  public static User getCurrentUser(){
    return mCurrentUser;
  }
}


    @RunWith(PowerMockRunner.class)
    @PrepareForTest(User.class)
    public MainActivityTest{
       @Test
       public void testCurrentUser{
        User probableUserDataFromDB = Mockito.mock(User.class); // Create a   mock instance of User class with some expected behaviour for testing purpose

        Mockito.when(probableUserDataFromDB.getUserName).thenReturn("my unique name");
        PowerMockito.mockstatic(User.class); // Readying the static methods for mocking
    Mockito.when(User.getCurrentUser).thenReturn(probableUserDataFromDB);// mock static method and return a mocked user instance with some expected behaviour

 //continue with your test.................
}

另请阅读pros & cons:)。