当前位置: 首页 > 知识库问答 >
问题:

注入Mockito Mock对象使用Spring JavaConfig和@autowmed

秦滨海
2023-03-14

我试图用Mockito mock对象替换@Autowired对象。通常的方法是使用Springockito使用xml:

<mockito:mock id="SomeMock" class="com.package.MockInterface" />

目前,我正在尝试使用Spring的JavaConfig来完成这项工作。突然之间,Java表达式比xml要详细得多:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
public class MyTestClass {

    @Configuration
    static class Config {
        @Bean
        public MockInterface somethingSpecial() {
            return Mockito.mock(MockInterface.class);
        }
    }

    @Autowired MockInterface mockObj;

    // test code
}

我发现了一个名为Springockito annotations的库,它允许您执行以下操作:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(loader=SpringockitoContextLoader.class)
public class MyTestClass {

    @Autowired @ReplaceWithMock MockInterface mockObj;

    // test code
}

显然,更漂亮:)唯一的问题是,这个上下文加载器不允许我对其他bean使用@Configuration和JavaConfig(如果我这样做,Spring会抱怨没有匹配这些自动连接字段的候选项)。

你们知道让Spring的JavaConfig和Springockito注释发挥作用的方法吗?或者,是否有其他用于创建模拟的速记?

作为一个不错的奖励,使用Springockito和XMLConfig,我能够模拟出具体的类,而无需为其依赖项(如果有的话)提供自动关联候选项。如果没有xml,这是不可能的吗?

共有3个答案

戎高爽
2023-03-14

似乎SpringockitoContextLoader扩展了GenericXmlContextLoader,其描述如下:

AbstractGenericContextLoader的具体实现,它从XML资源中读取bean定义。

因此,目前您仅限于xml bean定义。

您可以编写自己的上下文加载器,从SpringockitoContextLoader类中获取相关部分。看看这里开始,也许你可以扩展AnnotationConfigContextLoader,例如?

司空健
2023-03-14

请同时阅读@ethesx答案,Springockito未维护

现在可以模拟Spring应用程序,而不需要任何带有Springockito注释的XML文件。。此解决方案也适用于Spring Boot。

import static org.mockito.BDDMockito.*;
import org.kubek2k.springockito.annotations.*;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = Application.class, 
     loader = SpringockitoAnnotatedContextLoader.class)
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS)
public class MainControllerTest {

    @Autowired
    MainController mainController;

    @Autowired
    @ReplaceWithMock
    FooService fooService;

    @Test
    public void shouldGetBar() {
        //given
        given(fooService.result("foo")).willReturn("bar");

        //when
        Bar bar build = fooService.getBar("foo");

        //then
        assertThat(bar).isNotNull();
    }
}

依赖:org.kubek2k:springockito注释:1.0.9

汝跃
2023-03-14

从现在未维护的Spingockito注释(撰写本文时)转到Mockito,我们有一种非常简单的方法:

@RunWith(MockitoJUnitRunner.class)
@ContextConfiguration
public class MyTestClass {

    @Mock MockInterface mockObj;

    // test code
}

如果您使用的是真实对象,但希望模拟其中的依赖关系,例如使用DAO测试服务层:

@RunWith(MockitoJUnitRunner.class)
@ContextConfiguration
public class MyTestClass {

    @InjectMocks RealService;

    @Mock MockDAO mockDAO;

    // test code
}

最后,这也可以应用于Spring Boot,但是在支持多个类运行程序之前,在setUp()中使用注释初始化:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = MyMainSpringBootClass.class)
public class MyTestClass {

    @InjectMocks RealService;

    @Mock MockDAO mockDAO;

    @Before
    public final void setUp() throws Exception{
        MockitoAnnotations.initMocks(this);
    }

    // test code
}
 类似资料:
  • 我不熟悉Codeception,但在注入页面对象时遇到了一个问题。当我向页面对象添加以下构造逻辑时,就会出现问题。 ... 我从以下登录页面对象示例中获得:http://codeception.com/docs/06-ReusingTestCode#PageObjects 我得到的错误是: [Codeception\Exception\InjectionException]未能在“MyTest”实

  • 4.3、4.4节介绍了如何将C++对象导出到JavaScript环境,本节将介绍其逆操作,既:将JavaScript对象注入到C环境。 4.5.1 创建JavaScript对象/ID表 无论从内存模型的角度,还是从运行模型的角度,C原生代码都无法直接访问JavaScript中的对象。为此,我们需要提供一种途径,让C环境可以识别不同的JavaScript对象,最容易想到的,就是使用对象/ID表,该方

  • 问题内容: 我是JAX-RS的新手,我试图了解注释的工作方式。 在javadoc中有六个等级的列表()。但是,我在网络上找到将this注释与其他类型一起使用的代码,例如: 是否有可以与此注释一起使用的受支持类型的列表?在执行标准之间,此列表是否会更改? 我目前正在试验Jersey,我担心自己写的代码无法移植到其他JAX-RS实现中。 问题答案: 铆接的JAX-RS 规范定义了你可以通过注入的所有标

  • 我是 JAX-RS 的新手,我正在尝试了解注释应该如何工作。 在javadoc中有一个包含六个类的列表(< code >应用程序、< code>UriInfo、< code >请求、< code>HttpHeaders、< code >安全上下文、< code >提供者)。但是,我在网上找到了将this批注用于其他类型的代码,例如: 是否有可用于此批注的支持类型列表?该列表在标准实施期间是否发生变

  • 我刚开始使用Dagger并尝试使用dagger2进行DI,但看起来它给我的活动注入了一个空演示器。下面是我的代码。 公共类TasksActivity扩展AppCompatActivity{

  • 问题内容: 我的应用程序中有两个servlet,并且我希望将一个A类的对象注入到这两个servlet中,并且我还希望在整个应用程序中使用相同的ApplicationContext,即在此问题的第一个答案中提到的两个servlet: 春季注入Servlet 现在,我经历了许多这样的问题,但是找不到与我的问题完全匹配的东西。为了更好地说明问题,我在这里写一个粗糙的代码: 因此,上面是applicati