相关疑难解决方法(0)

将Mockito模拟注入Spring bean

我想将一个Mockito模拟对象注入一个Spring(3+)bean中,以便使用JUnit进行单元测试.我的bean依赖项目前通过@Autowired在私有成员字段上使用注释来注入.

我考虑过使用ReflectionTestUtils.setField但我希望注入的bean实例实际上是一个代理,因此不会声明目标类的私有成员字段.我不希望为依赖创建一个公共setter,因为我将修改我的界面纯粹是为了测试的目的.

我遵循了Spring社区给出的一些建议,但是没有创建模拟并且自动连线失败:

<bean id="dao" class="org.mockito.Mockito" factory-method="mock">
    <constructor-arg value="com.package.Dao" />
</bean>
Run Code Online (Sandbox Code Playgroud)

我目前遇到的错误如下:

...
Caused by: org...NoSuchBeanDefinitionException:
    No matching bean of type [com.package.Dao] found for dependency:
    expected at least 1 bean which qualifies as autowire candidate for this dependency.
    Dependency annotations: {
        @org...Autowired(required=true),
        @org...Qualifier(value=dao)
    }
at org...DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(D...y.java:901)
at org...DefaultListableBeanFactory.doResolveDependency(D...y.java:770)
Run Code Online (Sandbox Code Playgroud)

如果我将constructor-arg值设置为无效,则在启动应用程序上下文时不会发生错误.

junit spring annotations dependency-injection mockito

276
推荐指数
13
解决办法
23万
查看次数

如何在Spring上下文中注入模拟

我有一个使用一些Spring上下文的测试.在这些上下文中,声明了许多bean.我希望测试使用上下文的bean的实际实现,除了其中一个,我想要使用MOCK.

我尝试将Test作为一个配置组件(使用@Configuration注释),但XML似乎优先于@Bean注释,因此它不起作用,这样:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = {"context1.xml", "context2.xml", ...})
@Configuration
public class MyTest{

    @Inject
    private MyTargetBean target;

    private AnotherBean myMock = mock(AnotherBean.class);

    @Bean
    public AnotherBean myMock() { return myMock; }

    .....
Run Code Online (Sandbox Code Playgroud)

我知道我可以在XML中定义Mocks,但为此我需要为每个测试添加一个额外的XML文件,我希望在其中执行此操作.我想避免这种复杂性.

有没有办法在一个上下文中注入bean(比如模拟)而不是通过XML?

谢谢!

java spring dependency-injection mocking mockito

37
推荐指数
2
解决办法
8万
查看次数