Spring beans redefinition in unit test environment

前端 未结 13 1953
醉话见心
醉话见心 2020-12-07 11:13

We are using Spring for my application purposes, and Spring Testing framework for unit tests. We have a small problem though: the application code loads a Spring application

13条回答
  •  悲哀的现实
    2020-12-07 12:09

    I want to do the same thing, and we're finding it essential.

    The current mechanism we use is fairly manual but it works.

    Say for instance, you wish to mock out bean of type Y. What we do is every bean that has that dependency we make implement an interface - "IHasY". This interface is

    interface IHasY {
       public void setY(Y y);
    }
    

    Then in our test we call the util method...

     public static void insertMock(Y y) {
            Map invokers = BeanFactory.getInstance().getFactory("core").getBeansOfType(IHasY.class);
            for (Iterator iterator = invokers.values().iterator(); iterator.hasNext();) {
                IHasY invoker = (IHasY) iterator.next();
                invoker.setY(y);
            }
        }
    

    I do not want to create a whole xml file just to inject this new dependency and that is why I like this.

    If you're willing to create an xml config file then the way to go would be to create a new factory with the mock beans and make your default factory a parent of this factory. Make sure then that you load all your beans from the new child factory. When doing this the sub-factory will override the beans in the parent factory when the bean id's are the same.

    Now if, in my test, If I could programmatically create a factory, that would be awesome. Having to use xml is just too cumbersome. I'm looking to create that child factory with code. Then each test can configure its factory the way it wants. There's no reason why a factory like that won't work.

提交回复
热议问题