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...
}
}
不做mCurrentUser
public怎么处理这种问题?
有没有办法在常规 类 中创建方法来进行测试?
谢谢。
你可以嘲笑它。对于模拟,您可以使用像 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 :)。
我正在尝试使用 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...
}
}
不做mCurrentUser
public怎么处理这种问题?
有没有办法在常规 类 中创建方法来进行测试?
谢谢。
你可以嘲笑它。对于模拟,您可以使用像 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 :)。