Android警报对话框单元测试
警报片段 AlertManagerImpl AlertManagerImplTest 在这里,我创建了用于我的项目的AlertManager。因此,实现工作正常。但是现在我面临一个挑战,我需要为这个实现编写一些单元测试。特别是我需要测试以下场景Android警报对话框单元测试,android,unit-testing,robolectric,Android,Unit Testing,Robolectric,警报片段 AlertManagerImpl AlertManagerImplTest 在这里,我创建了用于我的项目的AlertManager。因此,实现工作正常。但是现在我面临一个挑战,我需要为这个实现编写一些单元测试。特别是我需要测试以下场景 显示一个警报->验证它是否正在显示 尝试显示一个带有“死机”活动的警报->验证没有发生崩溃 显示10个警报->验证是否显示了所有10个警报(以验证在大多数情况下我们是否可以信任该方法) 我创建了一个测试类来测试AlertManagerImpl的一个函
- 显示一个警报->验证它是否正在显示
- 尝试显示一个带有“死机”活动的警报->验证没有发生崩溃
- 显示10个警报->验证是否显示了所有10个警报(以验证在大多数情况下我们是否可以信任该方法)
实际上,到目前为止您所做的(
AlertManagerImplTest
)并不是单元测试。这更像是一个集成测试,因为它使用Robolectric运行,初始化应用程序并在设备或模拟器上运行
如果您想在真正的单元测试中测试您的AlertManagerImpl
,您应该编写一些简单的JUnit测试,并模拟/剔除您的AlertManagerImpl
使用的所有依赖项(FragmentActivity
,AlertFragment
)。
您可以编写自己的mock/stub类,或者使用Mockito之类的模拟框架。如果您想进一步模拟调用,如new AlertFragment()
,则必须使用更强大的模拟框架,如PowerMock。你也可以考虑重构你的代码(例如使用依赖注入),这样你就不必使用PrimoCK了。
public class AlertFragment extends DialogFragment {
private static final String TAG = "DeliveryRequestErrMsg";
private String mMsg;
private String mTitle;
private AlertDismissListener mAlertDismissListener;
private FragmentManager mFragmentManager;
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
return new AlertDialog
.Builder(getActivity())
.setTitle(mTitle)
.setMessage(mMsg)
.setNegativeButton(R.string.cart_btn_dismiss, null)
.create();
}
@Override
public void onDismiss(DialogInterface dialog) {
super.onDismiss(dialog);
mAlertDismissListener.onDismiss(this);
}
public AlertFragment title(String title) {
this.mTitle = title;
return this;
}
public AlertFragment msg(String mMsg) {
this.mMsg = mMsg;
return this;
}
public AlertFragment fragmentMgr(FragmentManager fragmentManager) {
mFragmentManager = fragmentManager;
return this;
}
public AlertFragment onDismiss(AlertDismissListener alertDismissListener) {
this.mAlertDismissListener = alertDismissListener;
return this;
}
public void show() {
try {
super.show(mFragmentManager, getClass().getName());
} catch (Exception e) {
Log.e(TAG, "show: ", e);
}
}
interface AlertDismissListener {
void onDismiss(AlertFragment fragment);
}
public String getMsg() {
return mMsg;
}
public String getTitle() {
return mTitle;
}
}
public class AlertManagerImpl implements AlertManager {
private List<AlertFragment> mListOfMessageShown = new ArrayList<>();
@Override
public boolean isMessageDisplayed(@Nonnull String message) {
boolean isAlreadyShown = false;
for (AlertFragment deliveryRequestErrMsgFragment : mListOfMessageShown) {
if (message.equals(deliveryRequestErrMsgFragment.getMsg())) {
isAlreadyShown = true;
break;
}
}
return isAlreadyShown;
}
@Override
public void showAlertMessage(@Nullable String title, String msg, FragmentActivity activity) {
AlertFragment deliveryRequestErrMsgFragment = new AlertFragment()
.title(title)
.msg(msg)
.onDismiss(fragment -> mListOfMessageShown.remove(fragment))
.fragmentMgr(activity.getSupportFragmentManager());
deliveryRequestErrMsgFragment.show();
mListOfMessageShown.add(deliveryRequestErrMsgFragment);
}
@Override
public void showAlertMessageWithoutDuplicates(@Nullable String title, String msg, FragmentActivity activity) {
if (!isMessageDisplayed(msg)) {
showAlertMessage(title, msg, activity);
}
}
}
public interface AlertManager {
/**
* This method allow user to show multiple same alert messages
*
* @param title Title that need to show
* @param msg Message that need to show
* @param activity
*/
void showAlertMessage(@Nullable String title, String msg, FragmentActivity activity);
/**
* This method does not allow user to show multiple same alert messages
*
* @param title Title that need to show
* @param msg Message that need to show
* @param activity
*/
void showAlertMessageWithoutDuplicates(@Nullable String title, String msg, FragmentActivity activity);
/**
* Verify if there is already a similar message currently displayed to the user. Returns true if a similar message is already showing, else returns false
*
* @param message The message that we want to compare with the currently displayed alert messages
* @return
*/
boolean isMessageDisplayed(@Nonnull String message);
}
@Config(constants = BuildConfig.class, sdk = TestConfig.SDK)
@RunWith(RobolectricTestRunner.class)
public class AlertManagerImplTest {
@Inject
AlertManager alertManager;
@Inject
Context mContext;
MainActivity mainActivity;
@Module(
includes = TestAppModule.class,
injects = AlertManagerImplTest.class,
overrides = true
)
static class TestModule {
}
@Before
public void setUp() {
mContext = RuntimeEnvironment.application;
FirebaseApp.initializeApp(mContext);
Services.initialize(new AlertManagerImplTest.TestModule()).inject(this);
mainActivity = Robolectric.buildActivity(MainActivity.class).create().get();
}
@Test
public void checkMessageDisplayed_WhenSameMessage_ShouldReturnTrue() throws Exception {
alertManager.showAlertMessage("Title1", "Message1", mainActivity);
Assert.assertTrue(alertManager.isMessageDisplayed("Message1"));
}
@Test
public void checkMessageDisplayed_WhenDifferentMessage_ShouldReturnFalse() throws Exception {
alertManager.showAlertMessage("Title1", "Message1", mainActivity);
Assert.assertFalse(alertManager.isMessageDisplayed("Message2"));
}
}