当前位置: 首页 > 知识库问答 >
问题:

MockitoException-是一个*void方法*并且它*不能*用一个*return value*挂接!

咸玄天
2023-03-14

我正在使用Mockito进行单元测试,我得到了以下异常。

org.mockito.exceptions.base.MockitoException: 
`'setResponseTimeStampUtc'` is a *void method* and it *cannot* be stubbed with a *return value*!
Voids are usually stubbed with Throwables:
    doThrow(exception).when(mock).someVoidMethod();
***

If you're unsure why you're getting above error read on.
Due to the nature of the syntax above problem might occur because:
1. The method you are trying to stub is *overloaded*. Make sure you are calling the right overloaded version.
2. Somewhere in your test you are stubbing *final methods*. Sorry, Mockito does not verify/stub final methods.
3. A spy is stubbed using `when(spy.foo()).then()` syntax. It is safer to stub spies - 
   - with `doReturn|Throw()` family of methods. More in javadocs for Mockito.spy() method.
@Repository
public class CardRepositoryImpl implements ICardRepository {        
    @Autowired
    private OperationBean operation;

    @Override
    public OperationBean getCardOperation(final String cardHolderId, final String requestTimeStamp) {
        operation.setRequestTimeStampUtc(requestTimeStamp);
        operation.setResponseTimeStampUtc(DateUtil.getUTCDate());
        return operation;
    }
}
@RunWith(MockitoJUnitRunner.class)
public class CardRepositoryImplUnitTestFixture_Mockito {
    @InjectMocks
    private CardRepositoryImpl cardRepositoryImpl;
    private OperationBean operationBean;

    @Before
    public void beforeTest() {
        MockitoAnnotations.initMocks(this);
    }
    @Test
    public void canGetCardOperation(){
        when(cardRepositoryImpl.getCardOperation("2", Mockito.anyString())).thenReturn(operationBean);

    }    
}

这是否是return语句的一个问题,因为format()方法是最后一个方法。

public static String getUTCDate() {
    final TimeZone timeZone = TimeZone.getTimeZone("UTC");
    final Calendar calendar = Calendar.getInstance(timeZone);
    final SimpleDateFormat simpleDateFormat = new SimpleDateFormat("YYYY-MM-dd'T'HH:mm:ss.SSS'Z'");
    simpleDateFormat.setTimeZone(timeZone);
    return simpleDateFormat.format(calendar.getTime());
}

我该如何解决这件事?

共有1个答案

薛扬
2023-03-14
@InjectMocks
private CardRepositoryImpl cardRepositoryImpl;

when(cardRepositoryImpl.getCardOperation("2", Mockito.anyString()))
    .thenReturn(operationBean);

CardRepositoryImpl不是一个模拟,因此您不能将其存根。通过@injectmocks,您将指示Mockito构造一个真正的CardRepositoryImpl,并将其私有字段和构造函数参数替换为测试用例上的字段。你可能会想用间谍代替;稍后再详细介绍。

但首先,为什么会出现错误消息?因为它不是模拟,所以对CardRepositoryImpl.GetCardOperation的调用发生在实际的CardRepositoryImplhtml" target="_blank">实例上。Mockito看到了与operationbean(看起来确实是一个模拟)的交互,将whenthenreturn视为与最近的模拟调用相对应,并错误地告诉您使用返回值截短了一个void方法(重要的是,错误的方法)。

在对CardRepositoryImpl的测试中,您不应该嘲弄CardRepositoryImpl,也不应该让它返回值:这不会测试任何东西,除了Mockito是否工作。您可能应该重新考虑您需要存根什么,以使您的测试工作。

但是,当截尾一个方法时,您可能希望截尾同一类中的另一个方法。这可以通过间谍来完成:

@Test
public void canGetCardOperation(){
    CardRepositoryImpl spyImpl = spy(cardRepositoryImpl);
    when(spyImpl.getCardOperation(Mockito.eq("2"), Mockito.anyString()))
        .thenReturn(returnValue);
    // ...
    spyImpl.someOtherMethod();  // Any matching calls to getCardOperation from
                                // someOtherMethod will use the stub above.
}

注意:在截短时,您可以相邻地使用anystring“2”。当使用类似anystring的匹配器时,如果对任何参数使用它们,则需要对所有参数使用它们。看这里更多。

 类似资料:
  • 在这里,我只想确保抛出异常测试,但希望跳过调用方法在其中。我试着跟着走,但没有奏效

  • 我有一个打字稿2类,目标是ES5。当我运行它时,我在控制台的主题行中得到了错误。Switch语句工作正常,但增量()和减量()方法不执行。

  • 我有一个问题与两行后添加异步和等待一个新的两个错误出现在等待行 “这个表达式有一种'void'类型,所以它的值不能被使用。 这是有问题的代码 你可以在这里看到源代码https://github.com/Akhele/Flutter-Weather-App/blob/master/lib/main.dart

  • 昨天我在这里看到了一个关于结构化绑定的有趣问题<我们可以总结如下。考虑下面的示例代码: 在这种情况下是(可能),因为这个项目符号(工作草稿): 如果是命名结构化绑定[...]的无括号id表达式,是结构化绑定声明规范中给出的引用类型 这是@Curity在评论中为感兴趣的人提供的关于wandbox的片段。它表明实际上不是引用,仅此而已。 到目前为止,对于最初的问题,OP问为什么它是而不是

  • 我有一个项目中有两个不同的运行时(一个是lambda,一个是fargate)。我有两个不同的配置,但只希望运行一个。 如何排除和包含配置类?这似乎不起作用: 而且由于它们位于相同的“路径”中,因此我不能仅排除软件包 因为“持久”包也将被排除。

  • 问题内容: 在Bruce Eckel的“ Thinking In Java,第四版”的第428页(有关类型信息的章节)中,具有以下示例: 也许我有点累,但是我看不到add()方法中对add()的调用是如何工作的。我一直认为它应该有一个引用,或者是一个静态方法(并且我在ArrayList或List中找不到静态add())。我想念什么? 我只是为自己测试,发现这可行: 问题答案: Java为这样的方法