java - 模拟服务、注入(inject)存储库和映射器。 Spring 中的集成测试

标签 java mockito mapstruct

我正在尝试模拟 Service,它负责从存储库获取实体并将它们映射到 Pojo。我收到错误,但我不明白为什么会这样。 有人知道我做错了什么吗?

错误:

class com.example.demo.businessLogic.person.Person cannot be cast to class 
com.example.demo.postgres.entity.PersonEntity (com.example.demo.businessLogic.person.Person and 
com.example.demo.postgres.entity.PersonEntity are in unnamed module of loader 'app')

java.lang.ClassCastException: class com.example.demo.businessLogic.person.Person cannot be cast to 
class com.example.demo.postgres.entity.PersonEntity (com.example.demo.businessLogic.person.Person
 and com.example.demo.postgres.entity.PersonEntity are in unnamed module of loader 'app')

personService.getAllPerson() 返回 Pojo:

@Override
public List<Person> getAllPerson() {
    return personRepoPostgres.findAll().stream()
            .map(personMapper::entityToPerson)
            .collect(Collectors.toList());
}

这是测试类:


@ExtendWith(MockitoExtension.class)
@ActiveProfiles("dev")
public class cTest {

    @Mock
    PersonRepoPostgres personRepoPostgres;

    @Mock
    PersonMapper personMapper;

    @InjectMocks
    PersonService personService;

    @Test
    void test(){
        Mockito.when(personService.getAllPerson()).thenReturn(List.of(new Person("Zamor")));
        List<Person> personArrayList = personService.getAllPerson();

        Assertions.assertEquals(personArrayList.get(0), "Zamor");
    }

最佳答案

问题是您试图模拟被测方法,而您应该只模拟被测方法的依赖关系。 Mockito.when应该用在 PersonRepoPostgress 中的方法上类或 PersonMapper类,而不是PersonService .

PersonMapper 没有模拟实现,所以当 personMapper::entityToPerson被称为默认实现可能正在尝试强制转换 PersonEntityPerson .

将您的模拟切换为类似的内容应该会有所帮助:

Mockito.when(personRepoPostgress.findAll()).thenReturn(List.of(new PersonEntity()));
Mockito.when(personMapper.entityToPerson(any(PersonEntity.class))).thenReturn(new Person("Zamor"));

关于java - 模拟服务、注入(inject)存储库和映射器。 Spring 中的集成测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68550255/

相关文章:

java - 在 Gradle 中管理传递依赖版本

java - Jaxb 解码返回空值

java - 如何修改 HttpUrlConnection 的 header

java - 如何使用 Mockito 测试 POST 方法

java - 即使应用程序处于后台,也会循环执行代码 fragment ?

java - 如何模拟DriverManager.getConnection?

spring-boot - Junit 5 与 Mockito java.lang.NoSuchMethodError org.junit.platform.engine.EngineDiscoveryRequest.getDiscoveryListener()

java - 如何使用 SpringJUnit4ClassRunner 将映射器(mapstruct)注入(inject)到 Junit 测试中

spring-boot - MapStruct 不使用 Kotlin 和 Spring Boot Autowiring ,使用 Gradle 构建

java - 是否可以使用MapStruct将java中的HashMap转换为List?