【问题标题】:How to unit test logic in an inner class using Mockito / Powermockito如何使用 Mockito / Powermockito 在内部类中对逻辑进行单元测试
【发布时间】:2017-06-26 03:21:21
【问题描述】:

我有以下课程要测试。

public class ClassToTest {

    private View view;

    public ClassToTest(View view) {
        this.view = view;
    }

    public void init() {
        view.add(new ParamClass.OnSomething() {
            @Override
            public void onSomethingElse() {
                view.doSomeWork();
            }
        });
    }
}

视图在哪里

public class View {
    public void add(OnSomething onSomething) {
    }

    public void doSomeWork() {
    }
}

我已经模拟了视图对象,但不知道如何测试标记为“这里要测试一些逻辑”的逻辑

ParamClass 是最终的。

public final class ParamClass {

  public interface onSomething {
    public void onSomethingElse();
  }
}

在不更改源代码的情况下,有没有办法使用 Mockito / Powermockito 对其进行单元测试?

我正在尝试验证 doSomeWork() 的调用

@RunWith(PowerMockRunner.class)
@PrepareForTest({ ClassToTest.class })
public class TestClass {

    @Mock View view;

    @Before
    public void init() {
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void test() throws Exception {
        ClassToTest classToTest = new ClassToTest(view);
        PowerMockito.doCallRealMethod().when(view).add(Mockito.any(ParamClass.OnSomething.class));
        PowerMockito.whenNew(ParamClass.OnSomething.class)
                .withAnyArguments()
                .thenReturn(new ParamClass.OnSomething() {
                    @Override
                    public void onSomethingElse() {
                        view.doSomeWork();
                    }
                });
        classToTest.init();
        Mockito.verify(view, Mockito.times(1)).doSomeWork();
    }
}

抛出异常

java.lang.ArrayIndexOutOfBoundsException: 0

at org.powermock.api.mockito.internal.expectation.DefaultConstructorExpectationSetup.withAnyArguments(DefaultConstructorExpectationSetup.java:66)
at com.linkedin.android.lite.animations.TestClass.test(TestClass.java:29)

【问题讨论】:

  • 这里有什么问题?您将实例传递给您的视图模拟,因此您将能够调用它。

标签: java unit-testing mockito inner-classes powermockito


【解决方案1】:

我想出了怎么做。更新答案。

public class TestClass {

    @Mock View view;

    @Before
    public void init() {
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void test() throws Exception {
        ClassToTest classToTest = new ClassToTest(view);
        classToTest.init();
        ArgumentCaptor<ParamClass.OnSomething> captor =
        ArgumentCaptor.forClass(ParamClass.OnSomething.class);
        verify(view).add(captor.capture());
        ParamClass.OnSomething onSomething = captor.getValue();
        onSomething.onSomethingElse();
        Mockito.verify(view, Mockito.times(1)).doSomeWork();
    }
}

【讨论】:

    【解决方案2】:

    那么你到底想测试什么?如果 onSomethingElse 中有调用其他对象/方法的代码,那么您可以简单地模拟所有其他调用,然后在调用的那些方法上使用 Mockito.verify(mockObjectHere).methodCalled() 如果您只想实现行为测试.

    【讨论】:

    • 我已经用我要测试的内容更新了代码
    猜你喜欢
    • 1970-01-01
    • 2021-09-19
    • 1970-01-01
    • 2015-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多