gpt4 book ai didi

java - Mockito 不模拟模拟对象的字段

转载 作者:行者123 更新时间:2023-11-30 12:01:50 24 4
gpt4 key购买 nike

我有一个如下所示的服务类:

public class MyServiceClassImpl implements MyServiceClass {

private final MyRepository myRepository;

private final EntityDTOConverter entityConverter;

...
}

其中 EntityDTOConverter 是一个将实体转换为 DTO 的 bean,反之亦然。它使用这样的 ModelMapper:

@Component
@RequiredArgsConstructor
public class EntityDTOConverter {

private final ModelMapper modelMapper = new ModelMapper();
...
}

然后我尝试像这样测试服务:

@ExtendWith(MockitoExtension.class)
class MyServiceClassImplTest {

@InjectMocks
private MyServiceClassImpl myServiceClass;

@Mock
private MyRepository myRepository;

@Mock
private EntityDTOConverter entityConverter;

private Entity myEntity;

private EntityDTO myEntityDTO;

@BeforeEach
public void setUp() {
myEntityDTO = new EntityDTO();

myEntity = Entity.newInstance("name", "surname", "email@email.com");
myEntity.setId(randomUUID());

lenient().when(myRepository.save(myEntity)).thenReturn(myEntity);
lenient().when(entityConverter.convert(any(EntityDTO.class))).thenReturn(myEntity);
}

基本上我试图设置任何通过转换器的 DTO 都应该被正确转换。但这是我得到的错误。当它尝试模拟 entityConverter.convert() 方法时,它实际上是在调用该方法。然后该方法使用 modelMapper,在此模拟中它是 null。 modelMapper 直接在类中初始化,如上文所述(尽管我也尝试将其作为应用程序上下文中的 bean 并注入(inject)它,但结果是一样的):

null modelMapper

这会在运行测试时导致 NPE。我该如何解决?

最佳答案

Mockito 不能破坏 Java 的规则。这包括它不能更改特定代码行的执行顺序。因此行

   lenient().when(entityConverter.convert(any(EntityDTO.class))).thenReturn(myEntity);

必须首先在您的真实EntityDTOConverter 类中执行convert() 方法。由于 EntityDTOConverter 类的当前实例是由 Mockito 创建的模拟,其字段被初始化为 null。因此,如果方法 convert() 访问此类属性,则会抛出 NPE。

这个问题的解决方案是使用另一种形式来配置模拟:

doReturn(myEntity)
.when(entityConverter).convert(any(EntityDTO.class))
// take care for the different positions of closing braces!

通过这种方式,mock(基本上是您的真实类的扩展)拦截了对 convert() 的调用,这样您在此方法中的真实代码就不会被执行,也不会抛出 NPE。

关于java - Mockito 不模拟模拟对象的字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59215754/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com