即使在使用 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()
,似乎没有任何问题。请大家帮忙解答一下?
- 这一行是错误的:
String str = service1.sendFunc(any(JSONObject.class));
any()
仅用于模拟,不用于真正的调用。
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()
时它工作正常。
感谢您的帮助!
我尝试了很多网站上给出的所有建议,但似乎对我的情况没有任何效果。
测试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()
,似乎没有任何问题。请大家帮忙解答一下?
- 这一行是错误的:
String str = service1.sendFunc(any(JSONObject.class));
any()
仅用于模拟,不用于真正的调用。
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()
时它工作正常。
感谢您的帮助!