2015-06-03 52 views
2

這可能與this question的根本問題相同,但更容易重現。Mockito在試圖在包私有超類上實現的存根方法時調用實際方法

問題是在模擬公共類上擴展接口方法實現的包私有類時,如何對接口方法進行stubbing接口方法。 Mockito將調用包私有類中真正的接口方法實現。看下面的例子。它實現的接口方法之一

接口

public interface DontCallMe { 
    int dontCallMeSuper(); 
    int dontCallMe(); 
} 

套餐默認類。

abstract class PackagePrivate 
     implements DontCallMe { 

    @Override 
    public int dontCallMeSuper() { 
     throw new IllegalArgumentException("don't call me super"); 
    } 
} 

實現其他的包私有類的公共子類。

public class Public 
    extends PackagePrivate { 

    public Public() { 
     super(); 
    } 

    @Override 
    public int dontCallMe() { 
     throw new IllegalArgumentException("don't call me"); 
    } 
} 

測試類運行測試

java.lang.IllegalArgumentException: don't call me super 
at PackagePrivate.dontCallMeSuper(PackagePrivate.java:6) 
at Public.dontCallMeSuper(Public.java:1) 
at ExampleJunit.testStaticConstructorInnerClass(ExampleJunit.java:19) 

我可以解決此通過使PackagePrivate公衆,但不是很大的

import static org.mockito.Mockito.mock; 
import static org.mockito.Mockito.when; 
import org.junit.Test; 

public class ExampleJunit { 

    @Test 
    public void testStaticConstructorInnerClass() { 
     final Public comparable = mock(Public.class); 
     when(comparable.dontCallMe()).thenReturn(1); 
     when(comparable.dontCallMeSuper()).thenReturn(1); 
    } 
} 

結果。有沒有什麼辦法讓我在PackagePrivate類中實現方法?

回答

1

你可以嘲笑而不是類接口(DontCallMe)(Public):

final DontCallMe comparable = mock(DontCallMe.class); 

或者,如果你需要模擬了在Public方法,但不是在DontCallMe,您可以創建一個新的接口並嘲笑它。

例如,使用原來的DontCallMe定義,你可以這樣做:

public interface IPackagePrivate extends DontCallMe { 
    int extraMethod(); 
} 

------ 

abstract class PackagePrivate implements IPackagePrivate { 
    public int dontCallMeSuper() { 
     throw new IllegalArgumentException("don't call me super"); 
    } 
} 

------ 

public class Public extends PackagePrivate { 

    public Public() { 
     super(); 
    } 

    public int dontCallMe() { 
     throw new IllegalArgumentException("don't call me"); 
    } 

    public int extraMethod() { 
     throw new IllegalArgumentException("extra method"); 
    } 
} 

------ 

import static org.mockito.Mockito.mock; 
import static org.mockito.Mockito.when; 
import org.junit.Test; 

public class ExampleJunit { 

    @Test 
    public void testStaticConstructorInnerClass() { 
     final IPackagePrivate comparable = mock(IPackagePrivate.class); 
     when(comparable.dontCallMe()).thenReturn(1); 
     when(comparable.dontCallMeSuper()).thenReturn(1); 
     when(comparable.extraMethod()).thenReturn(1); 
    } 
} 
+0

不錯,不幸的是,我嘲笑的實際代碼比這個例子複雜得多,我不能模擬這個接口。 –

+0

我追加了更多的答案。 – cybersam