Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 测试Spring:避免使用Mockito注入模拟对象_Java_Spring_Unit Testing_Dependency Injection_Mockito - Fatal编程技术网

Java 测试Spring:避免使用Mockito注入模拟对象

Java 测试Spring:避免使用Mockito注入模拟对象,java,spring,unit-testing,dependency-injection,mockito,Java,Spring,Unit Testing,Dependency Injection,Mockito,问题是:我有一个相当复杂的类B,其中定义了许多@Inject(其中一个类C)。这个类的一个实例被注入另一个类A,我想对它进行测试。 我的想法是,我希望将类B的mock注入a——我希望spring将其注入,以便在创建实例后执行init方法(因此这里没有@InjectMock来进行替代注入) 。我想做的是模拟Blub并将此实例注入BlubBlub——我想忽略Bla的存在 *已编辑* 主要的一点是,我希望上下文由Blub类的模拟和BlubBlub类的实例组成 @RunWith(SpringJUnit4

问题是:我有一个相当复杂的类B,其中定义了许多
@Inject
(其中一个类C)。这个类的一个实例被注入另一个类A,我想对它进行测试。 我的想法是,我希望将类B的mock注入a——我希望spring将其注入,以便在创建实例后执行init方法(因此这里没有
@InjectMock
来进行替代注入)

。我想做的是模拟Blub并将此实例注入BlubBlub——我想忽略Bla的存在

*已编辑*

主要的一点是,我希望上下文由Blub类的模拟和BlubBlub类的实例组成

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = MockInjectionTest.TestApp.class)
public class MockInjectionTest {
@Inject
public Blub blub;

@Inject
public BlubBlub blubblub;

@Configuration
public static class TestApp {
    @Bean
    Blub getBlub() {
        return mock(Blub.class);
    }

    @Bean
    BlubBlub getBlubBlub() {
        return new BlubBlub();
    }
}

@Test
public void testBlub() {
    Assert.assertNotNull(blub);
}

@Before
public void setup() {
    MockitoAnnotations.initMocks(this);
}

// the classes
public static class Bla {
}

public static class Blub {
    @Inject
    public Bla bla;
}

private static class BlubBlub {
    @Inject
    public Blub blub;
}
}
问题:当我通过使用
@mock
或通过在@Bean方法中显式调用mock(Blub)来定义Blub的mock时,当实例化
ApplicationContext
时(无论我使用的是xml配置还是基于注释的Bean定义),我都会遇到以下错误

因此,Spring显然仍然希望实例化原始类,而不仅仅是获取我提供的实例。这可能是创建上下文所必需的(如果我手动创建上下文并使用
ctx.getBean()
提取bean,它将在上下文构造中转储)

来自Guice,我将简单地将模拟实例绑定到模块中,一切都会很好

非常感谢您的帮助-听起来像是一个标准问题,但我找不到简单的解决方案


谢谢大家,fricke将您的配置更改为

@Configuration
public static class TestApp {

@Bean
Blub getBlub() {
    return mock(Blub.class);
}

@Bean
BlubBlub getBlubBlub() {
    return new BlubBlub();
}

@Bean
Bla getBla() {
   return mock(Bla.class)
}

}

Spring抱怨的是,应用程序上下文中不存在Bla实现,并且无法执行注入

您可以像这样返回空bean:

@Configuration
public static class TestApp {
    @Bean
    Blub getBlub() {
        return mock(Blub.class);
    }
    @Bean
    Bla getBla() {
        return null;
    }

    @Bean
    BlubBlub getBlubBlub() {
        return new BlubBlub();
    }
}
这将避免Bla实例上的注入,因为没有注入。 当您有许多@Injects时,这并不理想,但这是有效的

另一个不理想的解决方案是让bean实现一个接口,并模拟接口而不是实现类


我尝试了springockito,这对您的案例很有用,但在我的一个测试案例中,它是关于测试自定义BeanDefinitionRegistryPostProcessor的,它在很大程度上扰乱了正常的spring行为。

Hi@geoand,感谢您的快速回复;我就是这样做的,但假设我有十个这样的Bla类,它们应该被注入,然后我最终得到了大量的“纯”样板文件,这只是因为Spring将一些东西拉到了我不想包含在其中的上下文中。他们甚至没有注射。我希望上下文由一个Blub类的模拟和一个BlubBlub类的实例组成。也许这在Spring中是不可能的,这也是坚持使用Guice的一个好处,这是一个好问题。如果是这种情况,您应该签出Springockito项目,该项目的工作方式与您习惯使用的@InjectMock差不多。Hi@geoand,不幸的是Springockito在为所有“@Inject-ed”类构建上下文检查时确实帮助解决了这个问题。Hi@geoand,就像我声明“@ReplaceWithMock”@Inject private MyBean innerBean;Springockito扫描类MyBean,如果MyBean有”@注入未在上下文中声明的ed类(如上所述),然后上下文的构造中止。遗憾的是,这一个没有得到回答,我有相同的问题。请看一下,这帮助我解决了类似的问题
@Configuration
public static class TestApp {
    @Bean
    Blub getBlub() {
        return mock(Blub.class);
    }
    @Bean
    Bla getBla() {
        return null;
    }

    @Bean
    BlubBlub getBlubBlub() {
        return new BlubBlub();
    }
}