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

时间:2018-03-22 04:30:11

标签: java android unit-testing mocking

我正在尝试在java中为Android应用程序编写一些单元测试,但由于我是单元测试实现的新手,我想我需要一些帮助来解决以下特定问题。

我试图在google和stackoverflow中找到解决方案,但我没有找到任何帮助我的答案。

我在 A类

中有这个非常简单的方法
@Override
    public void beeperChanged(boolean active) {
        b.setBeeper(active);
        savePrinterToData(b);
    }

b 这是来自 b类的实例。

savePrinterToData 是一种允许在数据库中保存实例的方法 b

我想测试这些方法,更具体地说,测试是否,当我调用 beeperChanged 时, b 上调用 setBeeper ,如果<还会调用strong> 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);
        }

我已经读过验证可以或多或少地执行检查方法是否被调用的任务。但是android Studio强调红色声明说这是错误的,并没有给我任何解决方案。 (我目前没有测试是否调用 savePrinterToData ,因为我希望至少先解决 setBeeper 的问题)

我很困惑,任何帮助都会非常好。 谢谢

1 个答案:

答案 0 :(得分:0)

我认为问题在于你如何使用Powermock。 通常,@ Mock应该用于被测试类的依赖关系 并且应该使用@InjectMocks注释来获取被测试类的实例。

@InjectMocks
private A mA;

@Mock
private B mB;

区别:@Mock创造了一个&#34;哑巴&#34;类的代理,而@InjectMocks创建类的真实实例,并尝试匹配并设置@Mock实例与该类的字段。 所以在你展示的代码中,mA是一个愚蠢的代理测试对象,没有调用beeperChanged方法

更新 对不起没看过它是easymock框架,我的回答是假设mockito。对于Easymock,我认为等效注释是@TestSubject