gpt4 book ai didi

android - 困惑如何使用 Mockito 进行 android 测试

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:36:18 25 4
gpt4 key购买 nike

我正在尝试为我的 Android 应用程序编写单元测试,但无法使用 mockito 执行我想要的操作。这是与 Robolectric 一起使用的,我工作得很好并且已经证明单元测试有效。

我想根据是否连接了某些蓝牙设备来测试按钮是否会打开新 Activity 。显然,在我的测试中没有连接蓝牙的设备,但是我想假装好像有。蓝牙连接的状态存储在我的应用程序类中。没有可公开访问的方法来更改此值。

所以基本上应用程序中的逻辑是这样的:

HomeActivity.java:

//this gets called when the button to open the list is clicked.
public void openListActivity(View button) {
MyApplication myApplication = (MyApplication) getApplication();
if (myApplication.isDeviceConnected() {
startActivity(new intent(this, ListActivity.class));
}
}

所以为了测试这一点,我做了以下事情:

TestHomeActivity.java:

@Test
public void buttonShouldOpenListIfConnected() {
FlexApplication mockedApp = Mockito.mock(MyApplication.class);
Mockito.when(mockedApp.isDeviceConnected()).thenReturn(true);
//listViewButton was setup in @Before
listViewButton.performClick();
ShadowActivity shadowActivity = Robolectric.shadowOf(activity);

Intent intent = shadowActivity.getNextStartedActivity();
assertNotNull(intent); //this fails because no new activity was opened. I debugged this and found that isDeviceConnected returned false.
ShadowIntent shadowIntent = Robolectric.shadowOf(intent);
assertThat(shadowIntent.getComponent().getClassName(), equalTo(ListActivity.class.getName()));
}

所以我的单元测试失败了,因为对 isDeviceConnected 的调用(在 Activity 中)返回 false,即使我认为我告诉它使用模拟框架返回 true。我希望我的测试让这个方法返回 true。这不是 mockito 所做的,还是我完全弄错了如何使用 mockito?

最佳答案

这就是 mockito 的工作原理,但问题是:您的 listViewButton 是否正在使用您的 mockedApp?似乎不是,因为您正在测试方法中创建 mockedApp 并且从不在任何地方设置它。 Mockito 不会模拟 Application 的所有实例的方法调用,只会模拟您声明为模拟的内容。

我个人不知道 android 如何与 Application 类一起工作,但你必须将它设置在某个地方,以便 listView 使用你的 mockedApp 而不是它通常接收的内容.

编辑在更新问题之后,您可以在 protected 方法中转换您的 getApplicationspylistViewButton 并让它返回你的 mockedApp。这听起来有点糟糕,但如果您不能将应用程序模拟对象设置为 listViewButton,这是一种方法。

EDIT2

使用 BDDMockito 在测试中使用 spy 的示例为了可读性:)

public HomeActivity {
...
protected MyApplication getApplication() {
// real code
}
...
}

public void TestHomeActivity {
private HomeActivity homeActivity;

@Before
public void setUp() {
this.homeActivity = spy(new HomeActivity());
}

@Test
public void buttonShouldOpenListIfConnected() {
// given
FlexApplication mockedApp = Mockito.mock(MyApplication.class);
Mockito.when(mockedApp.isDeviceConnected()).thenReturn(true);
// IMPORTANT PART
given(homeActivity.getApplication()).willReturn(mockedApp);
...
}
}

之后,您的测试应该会按预期进行。但我强调:仅当您无法将 mockedApp 注入(inject) HomeActivity 时才使用 spy

关于android - 困惑如何使用 Mockito 进行 android 测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13980281/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com