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

标签 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 {
    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”行。

关于这个问题的任何建议或者我的方法是否完全错误。

org.mockito.exceptions.misusing.UnfinishedStubbingException: 
Unfinished stubbing detected here:

E.g. thenReturn() may be missing.
Examples of correct stubbing:
    when(mock.isOk()).thenReturn(true);
    when(mock.isOk()).thenThrow(exception);
    doThrow(exception).when(mock).someVoidMethod();
Hints:
 1. missing thenReturn()
 2. you are trying to stub a final method, you naughty developer!
 3: you are stubbing the behaviour of another mock inside before 'thenReturn' instruction if completed

最佳答案

语法:

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

应该是:

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

通过仅使用 spy 而不是 spy.getCursor() 调用 when,您可以为 Mockito 提供暂时的机会停用 getCursor 以便您可以 stub 它而不调用真实的东西。尽管这在这里似乎并不重要,但 Mockito 坚持要求您在 doAnswer 之后调用 when (等等)时保留这种模式。

关于java - Mockito - 如何监视 doAnswer 中的调用参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30116783/

相关文章:

java - 如何启动内存数据库来测试 JPA 实体?

javascript - 如何使用 Jasmine 测试我的 Javascript 回调?

swift - 单元测试的 Xcode 9 代码覆盖率显示错误百分比

java - Eclipse - 如何运行 2 个 junit 测试

java - 如何使用 JUnit 在 Spring 中测试 ConfigurationProperties?

java - 使用 JMockit 模拟 ResourceLoading

java - 通过方法调用获取 Spring beans 与 new 运算符

java - 关于 GWT 和 dockpanel 的问题,大小和调整大小

java - 无法从类中获取枚举值

angular - Uncaught TypeError : ace. acequire 不是函数