java - 验证方法是否被调用 - 单元测试

标签 java android unit-testing mocking

我正在尝试用 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/

相关文章:

java - 使用表情符号 unicode 标志国家/地区创建字符串

java - 热部署到 Jetty 的最佳解决方案是什么?

Android:向 ListView App Widget 添加多个 View

php - Codeception 单元测试 php.检查是否已使用特定参数调用函数

android - Kotlin android 应用程序 ExampleInstrumentedTest 不工作

java - DecimalFormat ,输入 123.45 ,期望 0123.4500

java - 如何在页面加载时触发 servlet 方法

android - 更新到 Android Studio 3.2 时出现 Gradle 错误

java - RxJava 过滤器运算符

c# - 有没有办法告诉 Autofixture 只设置具有特定属性的属性?