2015-07-12 149 views
2

我很難理解如何模擬/存根接口與Mockito。Mockito不能模擬一個接口?

這個簡單的場景......

public interface Adder 
{ 
    int add(int a, int b); 
} 

public class Calculator 
{ 
    Adder _adder; 

    public Calculator(Adder adder) 
    { 
     _adder = adder; 
    } 

    public int add(int a, int b) 
    { 
     return _adder.add(a, b); 
    } 
} 

public class MockitoTester 
{ 
    @Test 
    public void can_mock() 
    { 
     Adder adder = mock(Adder.class); 
     Calculator sut = new Calculator(adder); 
     assertThat(sut).isNotNull(); 
    } 
} 

是給我這個錯誤...

java.lang.NoClassDefFoundError: net/bytebuddy/dynamic/scaffold/subclass/ConstructorStrategy 
    at org.mockito.internal.creation.bytebuddy.CachingMockBytecodeGenerator.<init>(CachingMockBytecodeGenerator.java:20) 
    at org.mockito.internal.creation.bytebuddy.ByteBuddyMockMaker.<init>(ByteBuddyMockMaker.java:22) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:422) 
    at java.lang.Class.newInstance(Class.java:442) 
    at org.mockito.internal.configuration.plugins.PluginLoader.loadPlugin(PluginLoader.java:33) 
    at org.mockito.internal.configuration.plugins.PluginRegistry.<init>(PluginRegistry.java:12) 
    at org.mockito.internal.configuration.plugins.Plugins.<clinit>(Plugins.java:11) 
    at org.mockito.internal.util.MockUtil.<clinit>(MockUtil.java:23) 
    at org.mockito.internal.MockitoCore.<init>(MockitoCore.java:44) 
    at org.mockito.Mockito.<clinit>(Mockito.java:1101) 
    at com.jnericks.testutils.MockitoTester.can_mock(MockitoTester.java:13) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47) 
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44) 
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) 
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:309) 
    at org.junit.runner.JUnitCore.run(JUnitCore.java:160) 
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:78) 
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:212) 
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:68) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140) 
Caused by: java.lang.ClassNotFoundException: net.bytebuddy.dynamic.scaffold.subclass.ConstructorStrategy 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 
    ... 40 more 
+4

您從運行時類路徑中缺少一個庫(無論bytebuddy是什麼)。 –

+2

http://stackoverflow.com/questions/1457863/what-is-the-difference-between-noclassdeffounderror-and-classnotfoundexception?lq=1 –

+0

好的,謝謝。我認爲任何庫/依賴項都會被maven自動引入。我猜不會。我來自C#/ .net/nuget世界,並試圖在java/maven工作,它被證明是不是一個無縫過渡大聲笑 –

回答

5

依賴的Mockito的神器net.bytebuddy:byte-buddy。從Maven存儲庫中查看此POM definition。確保你獲得了mockito-all工件,其中包括一個Jar中的所有依賴關係。

如果您使用的是Maven,那麼在使用mockito-core時它應該自動解析依賴關係。您可以在項目上運行mvn dependency:tree以查看項目依存關係的層次結構。