Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.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-如何监视doAnswer中的调用参数_Java_Unit Testing_Junit_Mockito - Fatal编程技术网

Java Mockito-如何监视doAnswer中的调用参数

Java Mockito-如何监视doAnswer中的调用参数,java,unit-testing,junit,mockito,Java,Unit Testing,Junit,Mockito,这是我第一天使用Mockito编写单元测试,我可能从一个复杂的练习开始 下面是我的类结构,我正在为Class2.targetMethod()编写测试。Class1静态方法修改传入的对象,而不是返回任何结果 class Class1 { static void dbquery(OutParam out) { // Complex code to fill in db results in OutParam object } } class Class2 {

这是我第一天使用Mockito编写单元测试,我可能从一个复杂的练习开始

下面是我的类结构,我正在为Class2.targetMethod()编写测试。Class1静态方法修改传入的对象,而不是返回任何结果

class Class1 {
    static void dbquery(OutParam out) {
        // Complex code to fill in db results in OutParam object
    }
}

class Class2 {
    void targetMethod() {
        OutParam p1 = new OutParam1();
        Class1.dbquery(p1);
        ResultSet rs = p1.getCursor();
        ...
    }
}
以下是我的测试设置:

@RunWith(PowerMockRunner.class)
@PrepareForTest({Class1.class, Class2.class})
public class Class2Test {
    @Before
    public void setUp() throws Exception {

        PowerMockito.mockStatic(Class1.class);

        doAnswer(new Answer<Void>() {
            @Override
            public Void answer(InvocationOnMock invocation) throws Exception {
                OutParam result = (OutParam)invocation.getArguments()[1];
                OutParam spy = spy(result);
                ResultSet mockResult = mock(ResultSet.class);
                doReturn(mockResult).when(spy.getCursor());
                when(mockResult.getString("some_id")).thenReturn("first_id","second_id");
                when(mockResult.getString("name")).thenReturn("name1","name2");

                return null;
            }
        }).when(Class1.class, "dbquery", any());
    }
}
以下内容的语法:

doReturn(mockResult).when(spy.getCursor());
应该是:

doReturn(mockResult).when(spy).getCursor();

通过仅使用
spy
而不是
spy.getCursor()
调用
when
,您可以让Mockito暂时停用
getCursor
,这样您就可以在不调用真实对象的情况下对其进行存根。尽管这在这里似乎并不重要,但Mockito坚持认为,当
执行
拒绝
(etc)后调用
时,您应该保留此模式。

谢谢Jeff。这实际上解决了异常问题。然而,“spy”似乎只适用于doAnswer代码中的引用。如果设置断点,我就能看到间谍。但targetMethod()中的原始引用似乎没有被发现。所以它继续调用real方法。如何强制监视原始引用/对象?再次感谢
spy
使用可重写的方法创建传入对象的副本。它不是遥控器:为了让间谍生效,你需要将它插入到你的对象中,这样你的被测系统就会调用间谍。安装spy on object creation(在
@之前的
@方法中或在测试开始时)可能会更容易,并且只在以后将其存根。非常感谢Jeff的帮助。我修改了目标类本身,以设置spy对象代替测试中的原始对象。
doReturn(mockResult).when(spy).getCursor();