我在Play应用程序中使用基于Spring注释的配置。
控制器和DAO是Spring bean。控制器和DAO层使用不同的Spring配置文件定义,每个层可以单独禁用。
我想与DAO层隔离测试控制器层。我已禁用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作为模拟而不是真实对象?
UPD:
我正在使用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);
}
}));
}
...
}
我是这样做的,因为我不想让测试更可靠,并测试控制器在真实环境中的工作原理:
@Test
public void testControllerMethod() {
Result result = route(fakeRequest(GET, "/controller/method"));
assertThat(result).is(...);
}
答案 0 :(得分:1)
如果您需要模拟的依赖项数量很大,您也可以使用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())
}
答案 1 :(得分:0)