我正在尝试用 java 为 Android 应用程序编写一些单元测试,但由于我是单元测试实现的新手,我认为我需要一些帮助来解决以下特定问题。
我尝试在谷歌和 stackoverflow 上寻找解决方案,但没有找到任何对我有帮助的答案。
我在A类中有这个非常简单的方法:
@Override
public void beeperChanged(boolean active) {
b.setBeeper(active);
savePrinterToData(b);
}
b 这是b 类的一个实例。
savePrinterToData 是一种允许将实例b保存在数据库中的方法
我想测试这个方法,更具体地说测试当我调用 beeperChanged 时,是否在 b 上调用 setBeeper 以及是否也调用 savePrinterToData 。
我写了这个:
@RunWith(PowerMockRunner.class)
@PrepareForTest({PosApplication.class, AppInfoHelper.class, SharedPreferencesHelper.class})
public class OnePrinterSettingFragmentPresenterTest {
@Mock
private A mA;
@Mock
private B mB;
@Test
public void beeperChanged() throws Exception {
boolean boo;
boo = true;
mA.beeperChanged(boo);
verify(mB).setBeeper(boo);
}
我读到 verify 或多或少可以完成检查方法是否被调用的任务。但是android Studio用红色强调了该声明,说这是错误的,并且没有给我任何解决方案。 (我目前没有测试 savePrinterToData 是否被调用,因为我至少想先解决 setBeeper 的问题)
我很困惑,任何帮助都会非常好。 谢谢您
最佳答案
我认为问题在于你如何使用Powermock。 通常情况下,@Mock应该用于被测类的依赖 并且需要通过@InjectMocks注解获取被测类的实例。
@InjectMocks
private A mA;
@Mock
private B mB;
区别:@Mock 创建类的“哑”代理,而 @InjectMocks 创建类的真实实例,并尝试将 @Mock 实例与该类的字段进行匹配和设置。 因此,在您显示的代码中,mA 是一个愚蠢的代理测试对象,未调用 beeperChanged 方法
更新 抱歉没有读到它是easymock框架,我的答案是假设mockito。对于 Easymock 我认为等效的注释是 @TestSubject
关于java - 验证方法是否被调用 - 单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49420581/