FAILED CONFIGURATION:@BeforeClass setUp org.mockito.exceptions.base.MockitoException:无法初始化@Spy带注释的字段'allRequestParams'

时间:2016-03-16 19:58:56

标签: java spring-mvc jpa junit testng

我有一个应用程序(使用注释的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)

1 个答案:

答案 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代码编写。