2016-04-20 136 views
0

我有一个类控制器: 问题是在测试类的评论 - 我应该如何嘲笑myFactory对象并将此对象设置为控制器的属性?即使我用@ Mock/EasyMock来嘲笑工厂对象,我应该如何在自动装配中设置它在控制器中,它没有工厂的设置器 因此,我不能使用controller.setFactory() 另外,我该如何模拟在工厂对象的方法,我的方式做它与@Mock对象:Mockito.when(factory.someFactoryMethod).andReturn(“ABC”)春天 - 在另一个类的junit测试中设置自动装配对象

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") 
     */ 
    } 
} 

回答

2

我建议至少在自动绑定构造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); 

EDIT(使用注解) 这个测试类也可以是一个例子您使用注解从嘲讽的Mockito:https://github.com/gmaslowski/spock-groovy-sample/blob/master/src/test/java/com/gmaslowski/spock/sample/DummyServiceTest.java

0

你可以结合使用@InjectMocks@Spy

public class ControllerTest{ 
    @Mock 
    MyFactory factory; 

    @Spy 
    @InjectMocks 
    Controller testController; 

    @Before 
    public void initialize() { 
     //expectations 
    } 
} 
+0

难道你不需要调用'MockitoAnnotations.initMocks(this)'? – gmaslowski

+0

的确如此,或者使用MockitoJunitRunner – 6ton