2015-10-19 65 views
0

所以我是Mockito新來測試外牆。所以基本上我想檢查一下,如果服務的方法被調用一次。Mockito - 訪問驗證的私人/自動化字段()

這裏將是一個簡單的例子

我的服務

public class Service { 
    public int myMethod(int index, int number) { 
     if (index<4){ 
      index = index + number; 
     } 
     return index; 
    } 
} 

我的門面:

public class Facade { 

    private Service service; 

    public void method(){ 
     int i = service.myMethod(4, 2); 
    } 

} 

,最後我的測試:

public class FacadeTest { 
    @InjectMocks 
    private Facade classUnderTest; 

    @Mock (name="service") 
    private Service service; 

    @Before 
    public void setUp(){ 
     MockitoAnnotations.initMocks(this); 
    } 

    @Test 
    public void test(){ 
     verify(classUnderTest, times(1)).service.myMethod(4,2); 
    } 
} 

我知道這是可能的使用Get ter/Setter-methods在我的Facade中返回服務,但我想這樣做,而不這樣做。

按照我想要的方式,是否可以不對門面做任何改變?

是否有區別,當我有一個Spring項目,並使用@Autowired在門面內的服務變量?

謝謝!

+1

用你的測試方法用'service'替換'classUnderTest'並完成。您只能驗證模擬上的調用而不是測試中的類(因爲不受Mockito控制)。 –

+1

你不需要任何getter,因爲正面注入和使用的服務是'private Service服務;'。所以你有權訪問它,並且可以驗證它的方法已被調用。 –

回答

0

使用@InjectMocks會將註釋過的@Mock服務注入到外觀中。 因此,您不需要任何獲取或設置測試。

你似乎忘了在測試中調用方法。 試試這個:

@Test 
public void test(){ 
    classUnderTest.method(); 
    verify(service, times(1)).service.myMethod(4,2); 
} 

使用您的門面@Autowired服務將會對您的測試沒有任何影響,因爲春天是不是在裏面使用。當你運行你的應用程序時,Spring將注入合適的bean。