【问题标题】:Why is Mockito boolean stub being ignored为什么 Mockito 布尔存根被忽略
【发布时间】:2019-11-14 16:06:29
【问题描述】:

我有一个检查条件并做一些工作的方法。

public void doSomeWork(){
   if(!UtilityClass.someCondition()){
       context.getmeSomething();
   }
}

我的测试看起来像这样。

@Test
public void test(){
    myClass.doSomeWork();

    PowerMockito.verifyStatic(UtilityClass.class)
    when(UtilityClass.someCondition()).thenReturn(false);

    verify(mContext, times(1)).getmeSomething();
}

问题是存根被简单地忽略了。无论存根结果如何,测试都会通过。出于同样的原因,从不验证失败,我在测试中从不想要,但在 Mockito 的测试中想要在我的课堂上。我的问题是为什么布尔存根被忽略?

更新 我不确定这对我的原始问题是否重要,但 Utility 类包含在准备测试中,并且在 setUp 中有 mockStatic 调用。

【问题讨论】:

  • 必须在调用函数前加上when语句
  • 感谢您的快速回复,但同样的存根导致 mockito 抛出“实际上,与此模拟的交互为零”。
  • 您是否正确地将上下文模拟到 myClass 中?也许您正在检查与模拟上下文的交互,但您从未将模拟上下文设置为 MyClass 中使用的上下文

标签: android unit-testing mockito


【解决方案1】:

你的陈述的顺序!

  1. 注册您的模拟及其行为。
  2. 调用方法
  3. 验证

编辑: 您还应该确保 UtilityClass 是一个模拟。你不能存根实际的类,只能模拟它们。

@Rule
public MockitoRule rule = MockitoJUnit.rule();

@Mock
private UtilityClass utilityClassMock;

private MyClass myClass;

@Before
public void beforeEachTest() {
    myClass = new MyClass(utilityClassMock);
}


@Test
public void test(){
    when(utilityClassMock.someCondition).thenReturn(false); 

    myClass.doSomeWork();

    verify(mContext, times(1)).getmeSomething();
}

【讨论】:

  • 您可能还想指出,如果之后没有实际的验证声明,那么执行verifyStatic 是没有意义的。而且您在 someCondition 上缺少括号 ()(以及 UtilityClass 的静态模拟)。
【解决方案2】:

就像 GabrielJoerg 所说的那样,存根应该在方法调用之前首先发生。但这里真正的问题是,当存根时,你应该避免调用 verifyStatic。这对我有用。

@Test
public void test(){
    when(UtilityClass.someCondition()).thenReturn(false);

    myClass.doSomeWork();

    verify(mContext, times(1)).getmeSomething();
}

【讨论】:

    猜你喜欢
    • 2021-11-06
    • 2019-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-22
    相关资源
    最近更新 更多