Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Mockito-验证一个方法是否调用同一类中的另一个方法_Java_Junit_Mockito - Fatal编程技术网

Java Mockito-验证一个方法是否调用同一类中的另一个方法

Java Mockito-验证一个方法是否调用同一类中的另一个方法,java,junit,mockito,Java,Junit,Mockito,我试图测试一个方法是否调用同一类中的另一个方法。例如: public class Foo { public void bar(String a){ switch(a) { case "callBaz": baz(a); break; case "callBat": bat(a); break;

我试图测试一个方法是否调用同一类中的另一个方法。例如:

public class Foo {

    public void bar(String a){
        switch(a) {
            case "callBaz":
                baz(a);
                break;
            case "callBat":
                bat(a);
                break;
            default:
                System.out.println("Input was " + a);
        }
    } 

    public void baz(String b){
        System.out.println(b);
    }

    public void bat(String c){
        System.out.println(c);
    }
}
但是,如果我尝试对类本身进行mockito验证:

import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mockito;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)
public class FooTest {
    @Test
    public void testBazCalledFromBar(){
        Foo foo = new Foo();
        foo.bar("callBaz");
        Mockito.verify(foo).baz("callBaz");
    }
}
我得到一个例外:

org.mockito.exceptions.misusing.NotAMockException: 
Argument passed to verify() is of type Foo and is not a mock!
Make sure you place the parenthesis correctly!
See the examples of correct verifications:
    verify(mock).someMethod();
    verify(mock, times(10)).someMethod();
    verify(mock, atLeastOnce()).someMethod();
Wanted but not invoked:
foo.baz("callBaz");
-> at com.mn.stagportal.view.employee.FooTest.testBazCalledFromBar(FooTest.java:15)
However, there were other interactions with this mock:
foo.bar("callBaz");
-> at com.mn.stagportal.view.employee.FooTest.testBazCalledFromBar(FooTest.java:13)
使用模拟时:

我得到一个例外:

org.mockito.exceptions.misusing.NotAMockException: 
Argument passed to verify() is of type Foo and is not a mock!
Make sure you place the parenthesis correctly!
See the examples of correct verifications:
    verify(mock).someMethod();
    verify(mock, times(10)).someMethod();
    verify(mock, atLeastOnce()).someMethod();
Wanted but not invoked:
foo.baz("callBaz");
-> at com.mn.stagportal.view.employee.FooTest.testBazCalledFromBar(FooTest.java:15)
However, there were other interactions with this mock:
foo.bar("callBaz");
-> at com.mn.stagportal.view.employee.FooTest.testBazCalledFromBar(FooTest.java:13)
有人知道如何测试baz(“callBaz”)是否被调用吗?

这应该是可行的

@RunWith(SpringJUnit4ClassRunner.class)
public class FooTest {
  @Test
  public void testBazCalledFromBar(){
    Foo fooMock = Mockito.mock(Foo.class);
    doCallRealMethod().when(fooMock).bar(anyString());
    fooMock.bar("callBaz");

    Mockito.verify(fooMock).baz("callBaz");
  }
}
问题是,因为fooMock是一个mock,所以当它遇到这一行时

fooMock.bar(“callBaz”)

它不知道该怎么办。您需要告诉Mockito,是要模拟方法调用还是要调用真正的方法


只有当代码流转到此实际方法并调用
baz
方法时,“验证”才能起作用。

您不应该模拟测试对象,您可以改为监视:

@RunWith(SpringJUnit4ClassRunner.class)
public class FooTest {
  @Test
  public void testBazCalledFromBar(){
    Foo foo = Mockito.spy(Foo.class);
    foo.bar("callBaz");
    Mockito.verify(foo).baz("callBaz");
  }
}


这似乎是一个奇怪的事情,想测试。您应该测试
bar
是否具有正确的效果;而不是它使用哪些次要方法来实现这种效果。您的单元测试不应该依赖于方法的特定实现-这不是正确的测试方法。@DawoodibnKareem:我意识到这不是单元测试的首选方法,但因为有许多条件,我想独立于子方法测试主方法。并分别测试孩子们的方法。我想我可能必须回到绘图板上,这似乎不适用于非0-arg构造函数。我收到一个MockitoException:由以下原因引起:org.mockito.internal.creation.instance.InstanceException:无法创建'Foo$$EnhancerByMockitoWithCGLIB$$fdafa2c2'的实例。请确保它具有干净调用的0-arg构造函数。我将更新我的问题,以更好地反映problem@Lao当然,Mockito.spy()可以接收要实例化的类或已实例化的对象