2016-04-20 66 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