2017-02-04 103 views
1

我是Mockito新手,请帮助理解基本。模拟方法没有被调用 - java

根据我上面的代码应该打印5时mocked.add(6,7)得到调用,但add()方法没有被调用和代码打印0 ..为什么?这个代码的任何解决方案?

import org.mockito.Mockito; 

    import static org.mockito.Mockito.*; 


    class Calc{ 

     int add(int a,int b){ 
     System.out.println("add method called"); 
     return a+b; 
    } 

}

 class MockTest{ 
      public static void main(String[] args) { 
      Calc mocked=mock(Calc.class); 
      when(mocked.add(2,3)).thenReturn(5); 
      System.out.println(mocked.add(6,7)); 
     } 
     } 
+1

你的问题是没有意义的我。你明确地说mockito“当参数是2和3,然后返回5”,然后你传递6和7 ...为什么mockito应用该规则,如果前提条件不满足? – Tom

回答

1

为了得到个结果,你必须通过精确的PARAMS当您设置when..then作为。否则的Mockito会返回一个“默认”值(整数0:

值都嘲笑默认情况下,什么样的回报

为了透明和不引人注目所有的Mockito嘲笑由 默认返回“好“值。例如:。零,falseys,空 集合或空值参考的javadoc约磕碰,看看到底 默认情况下返回什么值

如果你想返回5的任意整数,然后使用:

when(mocked.add(Mockito.any(Integer.class),Mockito.any(Integer.class))).thenReturn(5); 
0

“模拟”只是一个空虚拟对象,它模拟“真实”对象的行为。如果您定义类似when(mocked.add(2,3)).thenReturn(5);的行为,那么当您收到这些确切的值时,您可以具体说明该模拟该做什么。

mocked.add(6,7)将在此时返回0,因为你还没有定义其行为的价值,因此使用默认值。因此,如果您想要涵盖所有可能的输入,可以使用@MaciejKowalski发布的解决方案,并使用像Mockito.any(Integer.class)这样的通用匹配器。

我仍然不清楚如何正确处理嘲笑。 Mock是一种向被测系统提供外部依赖的方法,无需设置整个依赖关系树。通常不会调用该类中的真正方法。这就是when(mocked.add(2,3)).thenReturn(5);的意思。它告诉模拟行为像真正的依赖关系,没有真正的依赖。

一个例子可能是这样的:

public class TestClass { 
    private ExternalDependency dep; 
    public void setDep(ExternalDependency dep) { 
     this.dep = dep; 
    } 
    public int calculate() { 
     return 5 + dep.doStuff(); 
    } 
} 

public class ExternalDependency { 
    public int doStuff() { 
     return 3; 
    } 
} 

现在,在您的测试代码,你可以使用嘲笑这样的:

@Test 
public void should_use_external_dependency() { 
    // Aquire a mocked object of the class 
    ExternalDependency mockedDep = Mockito.mock(ExternalDependency.class); 
    // Define its behaviour 
    Mockito.when(mockedDep.doStuff()).thenReturn(20); 

    TestClass sut = new TestClass(); 
    sut.setDep(mockedDep); 

    // should return 25, since we've defined the mocks behaviour to return 20 
    Assert.assertEquals(25, sut.calculate()); 
} 

如果sut.calculate()被调用时,在ExternalDependency的方法不应该是真的称为,它委托给嘲弄的存根对象。但是,如果你要拨打的真正类的真正方法,你可以使用一个间谍,而不是与Mockito.spy(ExternalDependency.class)或者你可以做到这一点与when(mockedDep.doStuff()).thenCallRealMethod();