用于REST控制器的Spring MVC 4,如何为测试用例自动装配不同的依赖项

时间:2018-01-24 19:01:28

标签: java spring junit

假设您有一个这样的控制器,并且您想要更改自动连接的依赖关系。有什么方法可以在/ src / main / java下为你的项目实现一个实现,然后在/ src / test / java下的测试代码中有一个模拟依赖项。 / src / main / java下的代码将内置到Web应用程序中。

@RestController
@RequestMapping("/u/util/")
public class HealthCheckAdapter {
    @Autowired    
    private HealthDbService healthCheck;

}

HealthDbService是一个Java接口,这里是一个示例具体类。我可以更改下面的限定符,但Spring仍会在测试用例中选择它吗?

@Repository
@Qualifier("basicHealthCheckService")
public class HealthCheckDefaultManager implements HealthDbService {
}

1 个答案:

答案 0 :(得分:3)

最简单,推荐的方法:使用构造函数注入:

@RestController
@RequestMapping("/u/util/")
public class HealthCheckAdapter {
    private HealthDbService healthCheck;

    @Autowired // not even needed in recent versions
    public HealthCheckAdapter(HealthDbService healthCheck) {
        this.healthCheck = healthCheck;
    }
}

现在进行单元测试:

new HealthCheckAdapter(new FakeHealthDbService());

或使用像Mockito这样的模拟API:

HealthDbService mockHealthDbService = mock(HealthDbService.class);
new HealthCheckAdapter(mockHealthDbService);

如果你使用Mockito,它也可以inject mock dependencies使用注释,即使你继续使用场注射。

最后,如果你想使用模拟MVC测试(测试注释,JSON序列化等),你可以使用Spring testing support(在Spring Boot中更容易使用)