Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用Mockito/Powermockito在内部类中单元测试逻辑_Java_Unit Testing_Mockito_Inner Classes_Powermockito - Fatal编程技术网

Java 如何使用Mockito/Powermockito在内部类中单元测试逻辑

Java 如何使用Mockito/Powermockito在内部类中单元测试逻辑,java,unit-testing,mockito,inner-classes,powermockito,Java,Unit Testing,Mockito,Inner Classes,Powermockito,我有以下课程要考 public class ClassToTest { private View view; public ClassToTest(View view) { this.view = view; } public void init() { view.add(new ParamClass.OnSomething() { @Override public void o

我有以下课程要考

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() {
    }
}
我模拟了view对象,但不知道如何测试标记为“Some logic here to test”的逻辑

最后一节课

public final class ParamClass {

  public interface onSomething {
    public void onSomethingElse();
  }
}
在不更改源代码的情况下,是否有方法使用Mockito/Powermockito对其进行单元测试

我正在尝试验证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)

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

我知道了怎么做。更新答案

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();
    }
}
公共类TestClass{
@模拟视图;
@以前
公共void init(){
initMocks(this);
}
@试验
public void test()引发异常{
ClassToTest ClassToTest=新的ClassToTest(视图);
classToTest.init();
辩手=
ArgumentCaptor.forClass(ParamClass.OnSomething.class);
验证(视图).add(captor.capture());
ParamClass.OnSomething OnSomething=captor.getValue();
onSomething.onSomethingElse();
验证(查看,Mockito.times(1)).doSomeWork();
}
}

这里有什么问题?您正在将实例传递给视图模拟,这样您就可以调用它了
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();
    }
}