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

Mockito如何通过UUID测试findById

洪楚
2023-03-14

我有一个测试类的问题。

在我的ParkingSpotService类中,有一个UUID找到的方法,我想为此编写一个测试:

@Transactional
public Optional<ParkingSpotModel> findById(UUID id) {
    return parkingSpotRepository.findById(id);
}

我做了什么?我创建了一个TestClass ParkingSpotServiceTest:

@SpringBootTest                                                                    
public class ParkingSpotServiceTest {

private static final UUID ID = UUID.fromString("35361d85-107c-4f1f-a047-263093161c1b");
private static final String PARKINGSPOTNUMBER = "1010";
private static final String LICENSEPLATECAR = "EAM3J81";
private static final String MODELCAR = "FIT";
private static final String BRANDCAR = "HONDA";
private static final String COLORCAR = "GREEN";
private static final LocalDateTime REGISTRATIONDATE = LocalDateTime.now();          
private static final String RESPONSIBLENAME = "Edison Azevedo";     
private static final String APARTMENT = "51";
private static final String BLOCK = "A";            

@InjectMocks
private ParkingSpotService service;

@Mock
private ParkingSpotRepository repository;

private ParkingSpotModel parkingSpot;   
private Optional<ParkingSpotModel> optionalParkingSpot;
Pageable pageable;

@BeforeEach
void setUp() {
    MockitoAnnotations.openMocks(this);
    startParkingSpot();
}

private void startParkingSpot() {
    parkingSpot = new ParkingSpotModel(ID, 
                                       PARKINGSPOTNUMBER, 
                                       LICENSEPLATECAR, 
                                       BRANDCAR, 
                                       MODELCAR, 
                                       COLORCAR, 
                                       REGISTRATIONDATE, 
                                       RESPONSIBLENAME, 
                                       APARTMENT, 
                                       BLOCK);      
    
    optionalParkingSpot = Optional.of(new ParkingSpotModel(ID, 
                                                           PARKINGSPOTNUMBER, 
                                                           LICENSEPLATECAR, 
                                                           BRANDCAR, 
                                                           MODELCAR, 
                                                           COLORCAR, 
                                                           REGISTRATIONDATE, 
                                                           RESPONSIBLENAME, 
                                                           APARTMENT, 
                                                           BLOCK));                 
}

}

在我创建了一个测试之后

@Test
void whenFindParkingSpotByIDThenReturnAnParkingSpotInstance() {     
    Mockito.when(repository.findById(Mockito.any(UUID.class))).thenReturn(optionalParkingSpot); 
    Optional<ParkingSpotModel> response = service.findById(ID); 
    **//above my response is value = null  ->  Optional.empty.    Why????????** 
    Assertions.assertNotNull(response);     
    
    Assertions.assertEquals(java.util.Optional.class, response.getClass());             
    
    Assertions.assertEquals(ID, response.get().getId());
    //here my test broke because my response "java.util.NoSuchElementException: No value present"

观察:

  1. 当我检查optionalParkingSpot时,所有数据都在那里。Mockito.when(repository.findById(Mockito.any(UUID. class)))。
  2. 当我检查ID时,正确地评估我的UUID(35361d85-107c-4f1f-a047-263093161c1b)可选

我的“响应”有什么问题?为什么数据是value=null-


共有1个答案

李泓
2023-03-14

您确定@beforeach注释方法中的调用顺序正确吗?首先用MockitoAnnotations初始化mock。OpenSock(this)然后初始化应该注入的值?我建议你换一种方式试试。

@BeforeEach
void setUp() {
    startParkingSpot();
    MockitoAnnotations.openMocks(this);
}

另外,不要忘记按中所述发布模拟https://javadoc.io/doc/org.mockito/mockito-core/latest/org/mockito/InjectMocks.html

或者,您可以删除注释并注入用Mockito创建的mock。模仿(…) 手动。

 类似资料:
  • 问题内容: 如何检查变量是否包含有效的UUID / GUID标识符? 我目前仅对验证类型1和4感兴趣,但这不应该限制您的答案。 问题答案: 当前,UUID是在RFC4122中指定的。一个经常被忽略的边缘情况是NIL UUID,以下正则表达式考虑到了这一点,并将返回NILUUID的匹配项。请参阅以下有关仅接受非NILUUID的UUID。这两种解决方案均适用于版本1至5(请参见第三个模块的第一个字符)

  • 问题内容: 我有一个旧类,其中包含用于实例化LoginContext()的new()调用: 我想使用Mockito测试类来模拟LoginContext,因为它要求在实例化之前设置JAAS安全性,但是我不确定如何在不更改login()方法以外部化LoginContext的情况下进行此操作。是否可以使用Mockito模拟LoginContext类? 问题答案: 对于将来,我会推荐伊兰·哈雷尔(Eran

  • 我有一个类需要进行单元测试: 我有一个测试用例: 当我运行测试用例时,没有使用ActiveMQConnectionFactory的模拟对象。相反,正在使用实际的实现,并且正在建立TCP连接: 我尝试了Powermockito和Mockito,但都失败了。如何模拟对象,如何成功运行测试用例? 我是单元测试新手,试图从各个社区获得帮助,但没有找到合适的答案。任何帮助都将不胜感激。谢谢

  • 问题内容: 我正在为我的React代码编写Jest测试,并希望使用/测试PropType检查。我对Javascript领域很陌生。我正在使用npm进行安装并有一个简单的方法: 在我的测试中。我的测试看起来很像玩笑/反应教程示例,其代码如下: 但是,似乎并未触发组件中的PropType检查。我知道检查仅在开发模式下运行,但是我还认为通过npm获得了开发版本。当我使用watchify构建组件时,检查会

  • 我有以下代码 我对嘲笑不熟悉。我有以下疑问。我正在尝试测试公共方法。 我是否可以断言私有变量workDone的值? 是否可以验证超类中的方法调用? 如何在方法中模拟私有方法调用?

  • 我通过adb自动关闭/打开wifi。 我想根据测试用例禁用/启用wifi 到目前为止,我在这里找到了很好的信息 但是,我想在执行以下命令之前测试连接: 以上命令如果启用则禁用wifi,如果禁用则启用wifi。我想先测试连接,并在需要时采取措施。我想知道是否有一种方法可以使用adb命令。这可以通过编程实现,但我希望通过亚行来实现,使其更加可靠。 此外,以下命令仅在设备为根目录时有效 此外,以下命令在