Spring:创建模拟而不是真实对象

时间:2016-03-27 07:38:01

标签: java spring unit-testing playframework mockito

我在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: 我正在使用FakeApplicationhttps://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(...);
}

2 个答案:

答案 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)

  1. 使用@RunWith(SpringJUnit4ClassRunner.class)标记您的单元测试
  2. 将您的测试类标记为@InjectMock
  3. 将Dao课程标记为@Mock
  4. 在项目中使用Mockito