Java 添加多个服务时,Springboot集成测试失败

Java 添加多个服务时,Springboot集成测试失败,java,spring-boot,junit,integration-testing,restapi,Java,Spring Boot,Junit,Integration Testing,Restapi,我有一个SpringBoot应用程序,它有一个控制器类、一个服务和一个存储库,运行得非常好。我已经为相同的应用程序添加了Junit测试用例,而且效果也非常好 @RestController public class EmployeeController{ @Autowired EmployeeService service; @GetMapping("/list") public List<Employee> getEmploye

我有一个SpringBoot应用程序,它有一个控制器类、一个服务和一个存储库,运行得非常好。我已经为相同的应用程序添加了Junit测试用例,而且效果也非常好

@RestController
public class EmployeeController{
    @Autowired
    EmployeeService service;

    @GetMapping("/list")
    public List<Employee> getEmployee(){
       return service.findAll();
    }
}


@Service
public class EmployeeService{
   
   @Autowired
   EmployeeRepository repository;

   public List<Employee> findAll(){
      return repository.findAll();
   }
}

@Repository
public interface EmployeeRepository extends JpaRepository<Employee, String>{}
测试用例一直通过,但目前我正在添加另一个API,如下所示,所有测试都失败了

@RestController
public class DepartmentController{
    @Autowired
    DepartmentService service;

    @GetMapping("/list")
    public List<Department> getDepartment(){
       return service.findAll();
    }
}


@Service
public class DepartmentService{
   
   @Autowired
   DepartmentRepository repository;

   public List<Department> findAll(){
      return repository.findAll();
   }
}
@Repository
public interface DepartmentRepository extends JpaRepository<Department, String>{}
添加Department services后,测试用例失败,错误如下:

Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'departmentController': Unsatisfied dependency expressed through field 'departmentService'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'departmentService': Unsatisfied dependency expressed through field 'repository'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.employeeapp.data.repository.DepartmentRepository' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

干杯

据我所知,您试图通过模拟您的服务来进行IT测试。在IT测试中,您不会嘲笑您的服务。在集成测试中,您测试所有组件是否协同工作。如果您不模拟存储库,那么它更像是一个E2E测试(端到端测试所有交互路径)

如果没有要测试的逻辑和/或不想在数据库中写入,则可以模拟存储库

因此,如果是单元测试,您可以尝试(它在我的项目中工作),我使用JUnit5(org.Junit.jupiter)


@WebMvcTest(DepartmentController.class)
公共类部门控制器测试{
@蚕豆
私人部门服务部门服务;
@自动连线
MockMvc-MockMvc;
@试验
公共无效findAllTest(){
//您可以为模拟创建一个要返回的列表
when(departmentService.findAll())。然后return(anyList);
//检查控制器是否返回某些内容
assertNotNull(departmentController.findAll());
//检查控制器是否调用该服务
验证(departmentService,Mockito.times(1)).findAll(anyList());
}
这是一个单元测试

It测试更像是


@ExtendWith(SpringExtension.class)
@春靴测试
公共课系{
@自动连线
部门服务部门服务;
@自动连线
私有WebApplicationContext wac;
私有MockMvc-MockMvc;
@之前
无效设置(){
这个.mvc=
MockMvcBuilders.webAppContextSetup(this.wac)
.build();
}
@试验
void departmentFindAll()引发异常{
MvcResult MvcResult=this.mockMvc.perform(get(“/YOUR\u CONTROLLER\u URL”)
.contentType(MediaType.APPLICATION_JSON))
.andExpect(状态()为(200))
.andReturn();
assertTrue(mvcResult.getResponse().getContentAsString().contains(“预期的内容”);
assertTrue(mvcResult.getResponse().getContentAsString().contains(“预期的内容”);
assertTrue(mvcResult.getResponse().getContentAsString().contains(“预期的内容”);
//你也可以检查它不是一个空的列表,没有错误被抛出等。。。
}
导入使用,因此您不会搜索太多


导入org.junit.jupiter.api.Assertions;
导入org.junit.jupiter.api.beforeach;
导入org.junit.jupiter.api.Test;
导入org.junit.jupiter.api.extension.extensedWith;
导入org.springframework.beans.factory.annotation.Autowired;
导入org.springframework.boot.test.context.SpringBootTest;
导入org.springframework.http.MediaType;
导入org.springframework.test.context.junit.jupiter.SpringExtension;
导入org.springframework.test.web.servlet.MockMvc;
导入org.springframework.test.web.servlet.MvcResult;
导入org.springframework.test.web.servlet.setup.MockMvcBuilders;
导入org.springframework.web.context.WebApplicationContext;
导入静态org.junit.jupiter.api.Assertions.*;
导入静态org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
导入静态org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
导入静态org.springframework.test.web.servlet.result.MockMvcResultMatchers.redirectedUrl;
导入静态org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
没有“com.employeeapp.data.repository.DepartmentRepository”类型的合格bean可用:至少需要1个符合autowire候选资格的bean。

Spring查找类型的bean
DepartmentRepository

  • 定义Bean
  • @存储库
    公共接口DepartmentRepository扩展了JpaRepository{}
    
    在这里添加注释
    @Repository
    ,这样Spring就可以将
    部门存储库
    变成一个Bean

  • 自动关联正确的类型和名称
  • @服务
    公务舱部门服务{
    @自动连线
    private DepartmentRepository repository;//最佳做法是在这里写入完整的bean名称DepartmentRepository。
    公共列表findAll(){
    返回repository.findAll();
    }
    }
    
    @RunWith(SpringRunner.class)
    @WebMvcTest(value = DepartmentController.class)
    class DepartmentControllerIntegrationTest {
        @Autowired
        private MockMvc mvc;
    
        @MockBean
        private DepartmentService service;
    
        @Test
        public void findAllDepartmentTest(){
        }
    }
    
    Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'departmentController': Unsatisfied dependency expressed through field 'departmentService'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'departmentService': Unsatisfied dependency expressed through field 'repository'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.employeeapp.data.repository.DepartmentRepository' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}