使用SpringJUnit4ClassRunner进行Junit测试

时间:2020-07-24 06:45:06

标签: spring junit

我正在尝试使用SpringJUnit4ClassRunner创建junit测试用例。

@Configuration
@ComponentScan(basePackages = { "com.controller",
        "com.service",
        "com.repository" })
class CustomConfiguration {

}

@RunWith(SpringJUnit4ClassRunner.class)
@org.springframework.test.context.ContextConfiguration(classes = CustomConfiguration.class)
public class Test {

    @InjectMocks
    @Spy
    private EmployeeController employeeController;

    @Mock
    EmployeeService employeeService;

    @Before
    public void initMocks() {
        MockitoAnnotations.initMocks(this);
    }

    @org.junit.Test
    public void test() throws Exception {

        Employee employee = new Employee();
        employee.setEmailId("admin@gmail.com");
        employee.setFirstName("admin");
        employee.setLastName("admin");

        Employee employee = employeeController.createEmployee(employee);
        assertNotNull(employee);
    }

}

给出类型为EmployeeRepository的没有合格bean的错误。

1 个答案:

答案 0 :(得分:0)

似乎很难为测试创建一个自定义配置类,但不会通过类路径扫描在后台创建存储库bean。如果您的目标是集成测试用例而不是junit,因为您似乎没有在所提供的代码中模拟任何东西,那么为什么不尝试使用更多更新的注释版本,例如使用SpringRunner.class而不是SpringJunit4Runner。 class,如果您的spring版本支持它。如果您只是想创建一个单元测试用例。为您想要模拟的东西创建一个模拟bean:

@Mock
SomeRepository repo;

此模拟在由junit启动时应自动注入到您的服务bean中。 如果您正在使用springboot,则:

@RunWith(SpringRunner.class)
@SpringBootTest
public class Test { 
  
    @Mock
    EmployeeService employeeService;
 
    @InjectMocks
    private EmployeeController employeeController;

    @org.junit.Test
    public void test() throws Exception {

        Employee employee = new Employee();
        employee.setEmailId("admin@gmail.com");
        employee.setFirstName("admin");
        employee.setLastName("admin");

        when(employeeService.save(any)).thenReturn(employee);
        Employee employee = employeeController.createEmployee(employee);
        assertNotNull(employee);
    }

}

以上是在springboot中进行单元测试的典型示例,但是对于您的控制器类,springboot提供注释@WebMvcTest或仅对Web层进行单元测试。如果要这样做,请阅读{ {3}}。