假设您有一个这样的控制器,并且您想要更改自动连接的依赖关系。有什么方法可以在/ 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 {
}
答案 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中更容易使用)