Junit 用Mockito调用mock方法而不是real方法

Junit 用Mockito调用mock方法而不是real方法,junit,mocking,mockito,Junit,Mocking,Mockito,我有一个需要调用的方法,而不是真正的方法。 相反,我得到了一个例外。有人能帮我找到通过mockito调用替代方法的正确方法吗 org.mockito.exceptions.misusing.InvalidUseOfMatchersException: Invalid use of argument matchers! 2 matchers expected, 4 recorded. This exception may occur if matchers are combined with r

我有一个需要调用的方法,而不是真正的方法。 相反,我得到了一个例外。有人能帮我找到通过mockito调用替代方法的正确方法吗

org.mockito.exceptions.misusing.InvalidUseOfMatchersException: 
Invalid use of argument matchers!
2 matchers expected, 4 recorded.
This exception may occur if matchers are combined with raw values:
    //incorrect:
    someMethod(anyObject(), "raw String");
When using matchers, all arguments have to be provided by matchers.
For example:
    //correct:
    someMethod(anyObject(), eq("String by matcher"));




    //Code starts here
class A{
   public realMethod(String s, Foo f){

   }
}

class B {
    public mockMethod(String s, Foo f) {

    }
}

class UnitTestClass{
    ClassA mock = new ClassA();
    mock.when(realMethod(any(String.class), any(Foo.class))).thenReturn(mockMethod(any(String.class),any(Foo.class));
}

你搞错了

在这里:

这根本没有什么意义

模拟的工作原理如下:

  • 您可以创建某个类的mock对象,比如
    a mock=mock(a.class)
  • 您可以在该模拟对象上指定交互
  • 您的代码意味着您认为这些规范的工作方式与“正常”代码类似,但它们确实不是

    要执行的操作:当使用某些参数调用某个对象时,然后返回另一个方法调用的结果

    例如:

    when(a.foo(x, y)).thenReturn(b.bar(x, y))
    
    这就是你想要做的。但问题是:这并不是那么容易。您不能在
    when()
    调用之前使用
    any()
    匹配器然后返回部分来“提供”在
    when()
    调用中传递的参数!很简单

    模拟应在特定的单元测试中进行,以获得特定的结果

    意思:你不是在写一个普通的程序,在这个程序中,将参数“转发”到另一个调用是有意义的。换言之;您的代码应该更像:

    when(mock.realMethod("a", someSpecificFoo)).thenReturn(mockMethod("a", someSpecificFoo))
    
    这是这里唯一可能的事情

    除此之外,您可能还想研究Mockito


    长话短说:看起来你根本不懂如何使用模拟框架。我建议您退后一步,阅读/学习各种教程。这不是你通过反复试验学到的东西

    非常感谢。。感谢您的反馈。。我同意我不明白,这是我第一次插手这件事。没关系。你的回答“足够好”,可以给出合理的答案。如果你考虑支持/接受,明天就可以自由地去做,因为我今天已经达到每日的上限了。您还可以使用thenAnswer转发参数并动态设置返回。看看这个问题的答案。
    when(mock.realMethod("a", someSpecificFoo)).thenReturn(mockMethod("a", someSpecificFoo))