Mockito 在调用 void 方法后断言

Mockito assert after calling a void method

@Test
public void shoudTestAssigneeSuccessfully() throws Exception {
    // given
    ApplicationUserDetails applicationUser = createApplicationUser();
    when(accessControlUtil.getLoggedInUser()).thenReturn(applicationUser);
    SomeEntity mockResponse = mock(SomeEntity.class);
    when(mockResponse.getAssignee()).thenReturn(applicationUser.getUsername());
    when(someRepository.findOneById(anyString())).thenReturn(Optional.of(mockResponse));
    when(someRepository.save(any(SomeEntity .class))).thenReturn(mockResponse);
    // when
    someService.submitSomething(new SomeDataDto(SOME_ID, SOME_PARAM)); // A void method
    // then
    assertNull(mockResponse.getAssignee()); // ??
    verify(someRepository).save(any(SomeEntity .class));
}

你好,我有这个测试,它基本上应该在执行服务调用 submitSomething 后检查 Assignee 是否为空。但是,submitSomething() 是一个 void 方法,它在内部将 Assignee 设置为 null。 请让我知道我需要进行哪些修改才能成功测试。

经过大量的反复试验,终于弄明白了。 解决方案相当简单。与其直接模拟 SomeEntity,我必须手动创建一个新的模拟实例并先手动设置 Assignee

@Test
public void shoudTestAssigneeSuccessfully() throws Exception {
    // given
    ApplicationUserDetails applicationUser = createApplicationUser();
    when(accessControlUtil.getLoggedInUser()).thenReturn(applicationUser);

    SomeEntity mockResponse = new SomeEntity();
    mockResponse.setAssignee(applicationUser.getUsername());

    when(someRepository.findOneById(anyString())).thenReturn(Optional.of(mockResponse));
    when(someRepository.save(any(SomeEntity .class))).thenReturn(mockResponse);
    // when
    someService.submitSomething(new SomeDataDto(SOME_ID, SOME_PARAM)); // A void method
    // then
    assertNull(mockResponse.getAssignee());
    verify(someRepository).save(any(SomeEntity .class));
}