【问题标题】:Unit test - Mockito and Butterknife - How to mock单元测试 - Mockito 和 Butterknife - 如何模拟
【发布时间】:2025-12-14 01:05:01
【问题描述】:

我有一个要进行单元测试的方法,它在内部调用Butterknife(Object.class, Activity.class)。它看起来像这样:

public void bindActivity(Activity activity) {
    this.activity = activity;
    unbinder = ButterKnife.bind(this, activity);
    init();
}

测试方法:

@Test
public void testBindActivity() throws Exception {
    Activity activity = mock(Activity.class);

    tested.bindActivity(activity);

    assertNotNull(tested.activity);
    assertNotNull(tested.unbinder);
    verify(tested).init();
}

测试在Butterknife 类中抛出 NPE,这是有道理的。我尝试使用Mockito.when() 来模拟和“隐藏”对Butterknife.bind() 的直接调用,然后重新运行模拟Unbinder 但没有任何成功。有什么解决办法吗?

【问题讨论】:

    标签: java android unit-testing mockito butterknife


    【解决方案1】:

    这可能无法回答您的问题,但单元测试应该测试您编写的逻辑,而不是内置于您的平台和库中的逻辑。您的第一个断言是测试 java 赋值运算符。你的第二个断言是测试 ButterKnife.bind 方法,最后一个是测试 java 方法调用机制!

    【讨论】:

      【解决方案2】:

      是的,在您的测试类中,您需要一个实例变量,例如:

      import org.mockito.Mock;
      import org.mockito.runners.MockitoJUnitRunner;
      import static org.mockito.Mockito.when;
      
      @RunWith(MockitoJUnitRunner.class)
      public class SomeTest {
      
          @Mock
          Activity mockActivity;
      
          ...
      
      }
      

      然后你需要将它注入到你正在测试的类中:

      tested.bindActivity(mockActivity);
      

      您可能还想添加一些 .when() 内容,例如:

      when(mockActivity.callsSomeMethod()).thenReturn("something");
      

      希望这就是你要找的东西。

      【讨论】:

        【解决方案3】:

        你不能用 Mockito 模拟像 Butterknife.bind() 这样的静态方法调用。

        您可以使用 Powermock 来执行此操作,但对于此类测试,您应该进行插装测试。

        看看here

        【讨论】: