Mockito - 模拟测试内联实现的声明

时间:2017-09-21 06:46:09

标签: java unit-testing mockito

我正在尝试模拟一个具有内联实现的语句。我想测试一下实现:

commonUtils.getCommandStack().execute(new RecordingCommand(commonUtils.getTed()) {
      @Override
      protected void doExecute() {
        //Statements needs to be tested
      }
    });

我嘲笑commonUtils.getCommandStack()commonUtils.getTed()。 我尝试了两种方法,但没有一种方法让控件进入doExecute()方法。

我尝试了两种方法,但没有一种方法适合我。

方法1 : 嘲笑如下所示的内联实现但不起作用

`TransactionalEditingDomain mockTed = Mockito.mock(TransactionalEditingDomain.class);
    Mockito.when(mockCommonUtils.getTed()).thenReturn(mockTed);
    CommandStack mockCommandStack = Mockito.mock(CommandStack.class);
    Mockito.when(mockTed.getCommandStack()).thenReturn(mockCommandStack);
    Mockito.doNothing().when(mockCommandStack).execute(new RecordingCommand(mockTed) {
      @Override
      protected void doExecute() {
      }
    });`

方法2 嘲弄RecordingCommand如下,但没有效果

`TransactionalEditingDomain mockTed = Mockito.mock(TransactionalEditingDomain.class);
    Mockito.when(mockCommonUtils.getTed()).thenReturn(mockTed);
    CommandStack mockCommandStack = Mockito.mock(CommandStack.class);
    Mockito.when(mockTed.getCommandStack()).thenReturn(mockCommandStack);
    Command recordingCommandMock = Mockito.mock(Command.class);
    Mockito.doNothing().when(mockCommandStack).execute(recordingCommandMock);`

请帮助我如何在doExecute()方法中获取控件,因为我在util中有很多这样的方法。

2 个答案:

答案 0 :(得分:1)

您可以将自己的代码编写到answer模拟的调用中。在这种情况下,您可以检索传入的对象并从那里调用它。

Mockito.when(mockCommandStack.execute()).thenAnswer(invocation -> {
    RecordingCommand commandReceived = (RecordingCommand)invocation.getArguments[0];
    commandReceived.doExecute(); // or whatever method applies here
});

答案 1 :(得分:0)

单元测试验证被测单元的公共可观察行为(返回值和/或与依赖项的通信)。

您的内联实现是一个实现细节,其中unittest显然不会测试。

您应该重构生产代码,以便内联实现成为自己的可测试单元。