Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.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-Mock一个语句来测试内联实现_Java_Unit Testing_Mockito - Fatal编程技术网

Java Mockito-Mock一个语句来测试内联实现

Java Mockito-Mock一个语句来测试内联实现,java,unit-testing,mockito,Java,Unit Testing,Mockito,我试图模拟一个具有内联实现的语句。我想测试实现: commonUtils.getCommandStack().execute(new RecordingCommand(commonUtils.getTed()) { @Override protected void doExecute() { //Statements needs to be tested } }); 我模拟了commonUtils.getCommandStack()和

我试图模拟一个具有内联实现的语句。我想测试实现:

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() {
      }
    });`
`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);`
方法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);
    Mockito.doNothing().when(mockCommandStack).execute(new RecordingCommand(mockTed) {
      @Override
      protected void doExecute() {
      }
    });`
`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中有许多类似的方法

您可以编写自己的代码来回答模拟呼叫。在这种情况下,您可以检索传入的对象并从那里调用它

Mockito.when(mockCommandStack.execute()).thenAnswer(invocation -> {
    RecordingCommand commandReceived = (RecordingCommand)invocation.getArguments[0];
    commandReceived.doExecute(); // or whatever method applies here
});
Unittest验证被测单元的公共可观察行为(返回值和/或与依赖项的通信)

您的内联实现是一个实现细节,unittest明确不测试该细节


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

在这两种方法中,所有模拟都很好,我的测试用例都通过了,但它跳过了doExecute()方法。Mockito。当不适用于void类型时,mockCommandStack.execute()返回void。