Android testing 创建仅用于测试的方法

Android testing create methods just for testing

我正在尝试使用 JUnit 和 espresso 为 activity 构建一个测试。

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

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

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

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...
  }

}

不做mCurrentUserpublic怎么处理这种问题?

有没有办法在常规 类 中创建方法来进行测试?

谢谢。

你可以嘲笑它。对于模拟,您可以使用像 Mockito & PowerMockito.

这样的模拟库

在 User 中创建一个方法来 return 该值并模拟该方法。如果您希望此方法专门用于测试,请使用 @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 :)。