我在 Play 应用程序中使用基于 Spring 注释的配置。
Controller 和 DAO 是 Spring bean。 Controller 和 DAO 层使用不同的 Spring 配置文件定义,并且每个层都可以单独禁用。
我想独立于 DAO 层来测试 Controller 层。我已禁用 DAO 配置文件并将每个 DAO bean 重新定义为 Mockito 模拟。从功能的角度来看它工作得很好,我唯一不喜欢的是像这样手动定义模拟:
@Configuration
@Import(AppContext.class)
public class TestAppContext {
@Bean
public DaoA getDaoA(){
return mock(DaoA.class);
}
//... all dependencies are re-defined manually
}
有没有办法定义包(例如使用@ComponentScan
注释)
并获取该包中的所有 bean 作为模拟而不是真实对象?
更新:
我正在使用 FakeApplication
( https://www.playframework.com/documentation/2.0/api/java/play/test/FakeApplication.html ) 运行测试,因此上下文不是在测试级别启动,而是在假应用程序启动内启动。
public class ControllerTest extends WithApplication {
@Before
public void setUp() throws Exception {
start(fakeApplication(new GlobalSettings(){
private ApplicationContext appContext;
public void onStart(Application app) {
appContext = new AnnotationConfigApplicationContext(TestAppContext.class);
}
@Override
public <A> A getControllerInstance(Class<A> clazz) throws Exception {
return appContext.getBean(clazz);
}
}));
}
...
}
我这样做是因为我不想让测试更可靠并测试 Controller 在真实环境中的工作方式:
@Test
public void testControllerMethod() {
Result result = route(fakeRequest(GET, "/controller/method"));
assertThat(result).is(...);
}
最佳答案
如果需要模拟的依赖项数量巨大,也可以使用spring-auto-mock .
@ContextConfiguration(classes = { AutoMockRegistryPostProcessor.class, RestOfClasses.class, ... })
@RunWith(SpringJUnit4ClassRunner.class)
public class YourTest {
...
}
当您自己创建 ApplicationContext
时,您可以通过编程方式注册后处理器:
public void onStart(Application app) {
appContext = new AnnotationConfigApplicationContext(TestAppContext.class);
appContext.getBeanFactory().addBeanPostProcessor(new AutoMockRegistryPostProcessor())
}
关于java - Spring:创建模拟而不是真实对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36244980/