【问题标题】:WrongTypeOfReturnValue: "Object" cannot be returned by findById()WrongTypeOfReturnValue:findById() 无法返回“对象”
【发布时间】:2019-07-08 13:02:15
【问题描述】:

我正在尝试对我的 Spring Boot 应用程序进行测试,但我遇到了一个大问题。这就是我的错误的样子:

org.mockito.exceptions.misusing.WrongTypeOfReturnValue: 
WorkItem cannot be returned by findById()
findById() should return Optional

我正在关注教程,每个人都在使用findOne(),但对我来说它不起作用。我的 IDE 显示:

" 类型参数 'S' 的推断类型 'S' 不在其范围内;应扩展 'com.java.workitemservice.model.WorkItem"

这就是为什么我以另一种方式尝试并使用findById(),但随后又出现了另一个错误。

{ 
    @RunWith(SpringRunner.class)  
    @SpringBootTest  
    public class WorkitemServiceApplicationTests {  

    @Mock  
    private WorkItemRepository workItemRepository;

    @InjectMocks
             WorkItemsController workItemsController;

    @Before
    public void init() {
    MockitoAnnotations.initMocks(this);
    }

    @Test
    public void testGetUserById() {
    WorkItem workItem = new WorkItem();
    workItem.setId(1L);

    //old version
    //when(workItemRepository.findOne(1L)).thenReturn(workItem);
    when(workItemRepository.findById(1L).orElse(null)).thenReturn(workItem);

    WorkItem workItem2 = workItemsController.getWorkItemById(1L);

    verify(workItemRepository).findById(1L).orElse(null);

    assertEquals(1L, workItem2.getId().longValue());
    }
}

我的仓库:

    @Repository
    public interface WorkItemRepository extends JpaRepository<WorkItem, 
    Long> {

    Optional <WorkItem> findWorkItemBySubject(String subject);
    }

我的服务方式:

    public WorkItem getWorkItemById(Long id) {
    return this.workItemRepository.findById(id)
    .orElseThrow(() -> new 
    ResourceNotFoundException("WorkItem", "id", id));
    }

我的控制器方法:

    @GetMapping("/workItems/{id}")
    public WorkItem getWorkItemById(@PathVariable(value = "id") Long 
    workItemId) {

    return this.workItemService.getWorkItemById(workItemId);
    }
}

【问题讨论】:

    标签: java spring-boot spring-data-jpa mockito


    【解决方案1】:

    由于错误状态,您没有返回方法签名声明为返回类型的内容(即Optional&lt;WorkItem&gt;

    直接返回

    Optional.of(workitem) 
    

    而不是workItem,即:

    when(workItemRepository.findById(1L).orElse(null)).thenReturn(Optional.of(workitem));
    

    【讨论】:

    • 我试过了,它显示“无法解析方法'thenReturn(java.util.Optional)”
    • 您可以尝试用workItemRepository.findById(1L) 替换workItemRepository.findById(1L).orElse(null) 吗?
    • 它编译但随后空指针出现在这一行“WorkItem workItem2 = workItemsController.getWorkItemById(1L);”我应该更改我的服务和控制器方法以返回 Optional 而不是 WorkItem?
    【解决方案2】:

    调用 findbyId() 时需要添加方法 get() 存储库中的大多数方法都返回一个可选的

      public WorkItem getWorkItemById(Long id) {
        return this.workItemRepository.findById(id).get()
        .orElseThrow(() -> new 
        ResourceNotFoundException("WorkItem", "id", id));
        }
    

    【讨论】:

      【解决方案3】:

      我在 cmets 中看到您尝试过这个:

      when(workItemRepository.findById(1L).orElse(null)).thenReturn(Optional.of(workitem));
      

      它应该可以工作。 我认为问题出在您的“orElse”电话中。

      准确来说,这里是当的方法:

      public static <T> OngoingStubbing<T> when(T methodCall) {
              return MOCKITO_CORE.when(methodCall);
          }
      

      所以我认为使用“orElse”可以防止推断出“T”。

      我的问题是为什么要使用 'orElse' ? 您正在对方法进行存根。

      您可以使用 'anyString' 来匹配任何参数。

      干杯

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-21
        • 1970-01-01
        • 2012-07-27
        • 2014-05-15
        相关资源
        最近更新 更多