2011-02-01 15 views
12

Ben sadece bazı statik yöntemler alay etmek gerek PowerMock 1.4.7 ve JUnit 4.8.2PowerMock: statik yöntemlerin alaycı (+ bazı belirli yöntemlerde orijinal değerlerini iade)

kullanmak ve den (tane yeni istiyorum aynı sınıf) sadece orijinal değeri döndürmek için. mockStatic ile alay ettiğimde ve when().doReturn() numaralı when().doReturn() numaralı telefonu aramazsanız, statik yöntemleri varsayılanlarını döndürür - Nesne 'u döndürürken null veya boolean ... döndürdüğünde yanlış. Bu yüzden varsayılan uygulamasına dönmek için thenCallRealMethod her statik yöntemde açıkça kullanmaya çalışıyorum (hiçbir alay yok/sahte sayılmaz) ama her olası argüman varyasyonunda nasıl çağıracağımı bilmiyorum (= Her olası giriş çağrısını istiyorum orijinal yöntem). Ben sadece somut argüman varyasyonunu alay etmeyi biliyorum.

cevap

27

Sen statik sınıf ve sahte yalnızca belirli yöntemler üzerinde bir casus kullanabilirsiniz:

stub(method(MyStaticClass.class, "getB")).toReturn("B"); 

Düzenleme::

stub kullanmak için

@RunWith(PowerMockRunner.class) 
@PrepareForTest(MyStaticTest.MyStaticClass.class) 
public class MyStaticTest { 

public static class MyStaticClass { 
    public static String getA(String a) { 
     return a; 
    } 
    public static String getB(String b) { 
     return b; 
    } 
} 

@Test 
public void should_partial_mock_static_class() throws Exception { 
    //given 
    PowerMockito.spy(MyStaticClass.class); 
    given(MyStaticClass.getB(Mockito.anyString())).willReturn("B"); 
    //then 
    assertEquals("A", MyStaticClass.getA("A")); 
    assertEquals("B", MyStaticClass.getA("B")); 
    assertEquals("C", MyStaticClass.getA("C")); 
    assertEquals("B", MyStaticClass.getB("A")); 
    assertEquals("B", MyStaticClass.getB("B")); 
    assertEquals("B", MyStaticClass.getB("C")); 
} 

} 
+1

Bu işe yaramasına rağmen, eşleyici bağımsız değişkenlerini kullanırken dikkatli olun. _Mockito.any() _ 'yi kullanacak olsaydınız ve bir casus yöntemini yerleştirmeye çalışıyorsanız, gerçek getB() impl'si saplama ifadesinin değerlendirilmesi sırasında çağrılır. GetB() boş argümanları işlemezse, bir NPE atılır. –

12

Ayrıca ağaç sökme API kullanabilirsiniz ve method, bu paketlerden gelen yöntemleri statik olarak içe aktarır:

  1. org.powermock.api.support.membermodification.MemberMatcher

fazla bilgi documentation bakın

  • org.powermock.api.support.membermodification.MemberModifier
  • .

    +0

    Bu yaklaşım benim için çalıştı, ancak denis.solonenko cevabı vermedi. Ne zaman, ne zaman verildiği, ne zaman verildiği, ve aynı şey hakkında yaptığı iddianın ne zaman kullanıldığını anlamak zor. Her bazen çalışır ve diğerleri değil –

    +0

    Statik sınıf ile kısmi alay yaparken bu yaklaşım benim için çalıştı. – srinannapa

    +1

    Teşekkürler, lütfen 'stub' yöntem kapsamını ekleyin – Mrusful

    İlgili konular