【发布时间】:2015-09-29 14:22:21
【问题描述】:
我想使用 Spring + JUnit + Mockito 测试一个类,但我无法使其正常工作。
假设我的类引用了一个服务:
@Controller
public class MyController
{
@Autowired
private MyService service;
@PostConstruct
public void init() {
service.whatever();
}
public void doSomething() {
service.create();
}
}
而且这个服务引用了一个存储库:
@Service
public class MyService {
@Autowired
private MyRepository repository;
public void whatever() {}
public void create() {
repository.save();
}
}
在测试 MyController 类时,我希望模拟该服务。问题是:即使服务被模拟,Spring 也会尝试在模拟中注入存储库。
这就是我所做的。测试类:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = { MyControllerTestConfiguration.class })
public class MyControllerTest {
@Autowired
private MyController myController;
@Test
public void testDoSomething() {
myController.doSomething();
}
}
配置类:
@Configuration
public class MyControllerTestConfiguration {
@Bean
public MyController myController() {
return new MyController();
}
@Bean
public MyService myService() {
return Mockito.mock(MyService.class);
}
}
我得到的错误是:org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [test.test.MyRepository] found for dependency
我尝试使用 Mockito 的 @InjectMocks 注释来初始化模拟,但这失败了,因为在模拟注入之前调用了 @PostConstruct 方法,生成了一个 NullPointerException。
而且我不能简单地模拟存储库,因为在现实生活中这会让我模拟很多类......
谁能帮我解决这个问题?
【问题讨论】:
标签: java spring unit-testing junit mockito