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

标签 java spring unit-testing playframework mockito

我在 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/

相关文章:

c# - 如果设置了所有属性,如何进行单元测试。没有重复

android - 如何使用单元测试来测试按钮是否启动了正确的 Activity

java - SFTP 和 Camel 。无法将目录更改为。私钥无效

java - 尝试从 .getText() 解析字符串时出现 NumberFormatException;

java - JSF EL 条件

java - 我可以忽略一个带有 Jackson 和 Spring 的 setter 吗?

java - 将 Spring 的健康指标映射到指标

java - 如何读取文件并保存到 hashmap 中,然后将第一个元素保存为键,其余元素保存在集合中?

spring - 使用 Hibernate/JPA 持久化复杂的 @Embeddable

ruby-on-rails - Ruby on Rails 中 RESTful POST 的功能测试