【问题标题】:Spring - Set autowired object in another class for junit testsSpring - 在另一个类中设置自动装配对象以进行junit测试
【发布时间】:2016-04-20 20:00:06
【问题描述】:

我有一个类控制器: 问题在 Test 类的 cmets 中——我应该如何模拟 myFactory 对象并将该对象设置为控制器的属性?即使我使用@Mock/EasyMock 模拟工厂对象,我应该如何在控制器中设置它,就像使用自动装配一样,它没有工厂的设置器 所以,我不能使用 controller.setFactory() 另外,我如何模拟工厂对象中的方法,就像我对带有 @Mock 的对象所做的那样:Mockito.when(factory.someFactoryMethod).andReturn("abc")

public class Controller{
    @Autowired
    MyFactory factory;

    someMethod(){
        String abh = factory.someFactoryMethod("defaultObject");
    }
}

public class MyFactory{
    public String someFactoryMethod(String argument){
        //some code
    }
}


public class ControllerTest{
    @Before
    public void initialize() {
       Controller testController = spy(new Controller());
           /*
        how should I mock myFactory object and set this object as a property of controller? Even if I mock the factory object using @Mock/ EasyMock, how should I set this in controller as with Autowiring, it does not have the setter for factory
        So, I cant use controller.setFactory(<mocked object>)
        Also, How do I mock the methods in factory object , the way I do it for objects with @Mock : Mockito.when(factory.someFactoryMethod).andReturn("abc") 
        */
    }
}

【问题讨论】:

    标签: spring spring-mvc junit factory


    【解决方案1】:

    我建议至少在构造函数 lvl 上自动装配:

    private final MyFactory factory;
    
    @Autowired
    public Controller(MyFactory factory) {
      this.factory = factory;
    }
    

    与测试相比,您可以模拟(通过 Mockito 或创建您自己的)或将具体实例传递给控制器​​:

    @Before
    public void initialize() {
      private Controller testController = new Controller(factory);
    }
    

    要模拟工厂并使用您指定的given,您可以像这样模拟它:

    MyFactory factory = Mockito.mock(MyFactory.class);
    

    编辑(使用注释) 这个测试类也可以作为您使用 Mockito 中基于注释的模拟的示例:https://github.com/gmaslowski/spock-groovy-sample/blob/master/src/test/java/com/gmaslowski/spock/sample/DummyServiceTest.java

    【讨论】:

      【解决方案2】:

      您可以将@InjectMocks@Spy 结合使用

      public class ControllerTest{
          @Mock
          MyFactory factory;
      
          @Spy
          @InjectMocks
          Controller testController;
      
          @Before
          public void initialize() {
              //expectations
          }
      }
      

      【讨论】:

      • 不需要调用MockitoAnnotations.initMocks(this) 吗?
      猜你喜欢
      • 2021-12-23
      • 1970-01-01
      • 2014-03-11
      • 2011-04-09
      • 2018-03-07
      • 2011-01-30
      • 1970-01-01
      • 1970-01-01
      • 2015-03-03
      相关资源
      最近更新 更多