即使在使用 Mockito.Spy 后仍调用原始方法

Original Method Called even after using Mockito.Spy

我尝试了很多网站上给出的所有建议,但似乎对我的情况没有任何效果。

测试class

@Autowired
Service service;

@Test
public void Test() throws Exception {
    Service service1 = Mockito.spy(service);
    JSONObject obj = new JSONObject();
    Mockito.doReturn(obj).when(service1).getFunc(any(JSONObject.class));
    String str = service1.sendFunc(any(JSONObject.class));
    assertNotEquals(null, str);
}

服务Class

public class Service {
    public String sendFunc(JSONObject arg) {
        String str = getFunc(arg);
    }
    public String getFunc(JSONObject arg) {
        return "Pass";
    }
}

调试后我意识到即使在模拟它之后也是如此。正在调用原始方法 getFunc(),似乎没有任何问题。请大家帮忙解答一下?

  1. 这一行是错误的:
String str = service1.sendFunc(any(JSONObject.class));

any()仅用于模拟,不用于真正的调用。

  1. any(JSONOject.class)

Matches any object of given type, excluding nulls.

但是你没有传递一个对象,你传递了一个class,它不是那个class的对象。所以我假设您将其替换为 eq()。 (我认为在那种情况下你根本不需要 ArgumentMatcher

如果您正在编写 @SpringBootTest(因此,如果您正在加载应用上下文),那么您应该使用 @SpyBean 注释,如下所示:

@SpringBootTest
public class SimpleTest {

    @SpyBean
    MyService myService;

    @Test
    public void test() throws Exception {
        when(myService.getFunc(any())).thenReturn(something);
        
        String str = myService.sendFunc(...);

        assertNotEquals(null, str);
    }
}

如果你不想单独加载上下文和测试class,你可以使用@Spy注解或者Mockito.spy():

@ExtendWith(MockitoExtension.class)
public class SimpleTest {

    @Spy
    MyService service1;

    @Test
    public void test() throws Exception {

       // MyService service1 = Mockito.spy(new MyService()); // if without @Spy

        when(service1.getFunc(any())).thenReturn(something);

        String str = service1.sendFunc(obj);
        assertNotEquals(null, str);
    }
}

解决了。显然,我在使用 service1.sendFunc(any(JSONObject.class)) 时发送了 any(JSONObject.class),但是当我发送 new JSONObject() 时它工作正常。 感谢您的帮助!