单元测试 - Mockito和Butterknife - 如何模拟

时间:2017-01-17 10:37:16

标签: java android unit-testing mockito butterknife

我有一个方法,我想进行单元测试,内部调用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,但没有任何成功。这有什么解决方案吗?

3 个答案:

答案 0 :(得分:0)

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

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");

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

答案 1 :(得分:0)

您不能使用Mockito模拟静态方法调用,如Butterknife.bind()。

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

看看here

答案 2 :(得分:0)

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