虽然Service层是依赖持久层,但测试Service层时不需要考虑持久层的实现逻辑

@Service
public class EmployeeServiceImpl implements EmployeeService {
 
    @Autowired
    private EmployeeRepository employeeRepository;
 
    @Override
    public Employee getEmployeeByName(String name) {
        return employeeRepository.findByName(name);
    }
}

理想情况下,我们测试Service代码时,不需要去注入整个持久层。我们可以通过Spring Boot Test提供的Mock机制来实现这一效果。以下是测试代码:

@RunWith(SpringRunner.class)
public class EmployeeServiceImplIntegrationTest {

    @TestConfiguration
    static class EmployeeServiceImplTestContextConfiguration {
  
        @Bean
        public EmployeeService employeeService() {
            return new EmployeeServiceImpl();
        }
    }
 
    @Autowired
    private EmployeeService employeeService;
 
    @MockBean
    private EmployeeRepository employeeRepository;
 
    // write test cases here
}

@TestConfiguration 注解:仅限测试类(src/test/java)使用,避免被组件扫描识别到
@MockBean 创建EmployeeRepository的Mock,避免真正去调用EmployeeRepository

@Before
public void setUp() {
    Employee alex = new Employee("alex");
 
    Mockito.when(employeeRepository.findByName(alex.getName()))
      .thenReturn(alex);
}

@Test
public void whenValidName_thenEmployeeShouldBeFound() {
    String name = "alex";
    Employee found = employeeService.getEmployeeByName(name);
  
     assertThat(found.getName())
          .isEqualTo(name);
 }

coolcode
0 声望0 粉丝