即使在使用mockito.spy后仍调用原始方法

vof42yt1  于 2021-08-20  发布在  Java
关注(0)|答案(2)|浏览(450)

我尝试了许多网站上提供的所有建议,但在我的情况下似乎没有任何效果。
测试班

@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(obj);
    assertNotEquals(null, str);
}

服务类

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

调试后,我意识到,即使在嘲笑它。原始方法 getFunc() 有人打电话来,但似乎没什么问题。请帮我弄清楚?

5anewei6

5anewei61#

这一行是错误的:

String str = service1.sendFunc(any(JSONObject.class));
``` `any()` 只用于模拟,不用于真正的调用。 `any(JSONOject.class)` 匹配给定类型的任何对象,不包括null。
但是你没有传递一个对象,你传递的是一个类,它不是那个类的对象。所以我想你应该用 `eq()` . (我想你不需要医生 `ArgumentMatcher` (在这种情况下)
pb3s4cty

pb3s4cty2#

如果你在写 @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);
    }
}

如果不想单独加载上下文和测试类,可以使用 @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);
    }
}

相关问题