我有一个应用程序(使用注释的Spring MVC 4 + Hibernate / JPA + MySQL + Maven集成示例),使用基于注释的配置将Spring与Hibernate集成。
我想测试一个控制器的这种方法:
@RequestMapping(value = { "/androidCallBack" }, method = RequestMethod.GET)
public String performAndroidCallBack(@RequestParam Map<String, String> allRequestParams) throws ClientProtocolException, IOException {
...
}
这是测试
public class AndroidCallBackControllerTest {
@InjectMocks
AndroidCallBackController androidCallBackController;
@Spy
Map<String, String> allRequestParams;
@BeforeClass
public void setUp(){
MockitoAnnotations.initMocks(this);
}
@Test
public void androidCallBack() throws ClientProtocolException, IOException {
Assert.assertEquals(androidCallBackController.performAndroidCallBack(allRequestParams), "alldevices");
}
}
但运行测试时出现此错误
FAILED CONFIGURATION: @BeforeClass setUp
org.mockito.exceptions.base.MockitoException: Unable to initialize @Spy annotated field 'allRequestParams'.
Type 'Map' is an interface and it cannot be spied on.
at com.tdk.oti.controller.AndroidCallBackControllerTest.setUp(AndroidCallBackControllerTest.java:25)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
答案 0 :(得分:2)
我认为下面的声明存在问题
@Spy
Map<String, String> allRequestParams;
对间谍&#39;是否有意义。在Map
上。 A&#39;间谍&#39;对象是从一个真实的&#39;创建的。对象,默认情况下,spy上的调用方法在真实对象上调用相同的方法。一旦你创建了间谍,你可以根据需要改变间谍上某些方法的行为。但是,由于Map
是一个界面,因此您没有真正的对象可以开始,因此Mockito无法创建“间谍”对象。如果方法的行为没有被更改,我们会打电话。
相反,您可以使用
模拟地图@Mock
Map<String, String> allRequestParams;
或忘记此集合的模拟和间谍,只需使用HashMap<String, String>
。
就个人而言,我在这里采用HashMap
方法。我真的没有看到需要模拟像集合类一样重要的Java类。可以安全地假设它们将按照指定的方式运行,并且如果没有它们,也很难用Java代码编写。