【问题标题】:FAILED CONFIGURATION: @BeforeClass setUp org.mockito.exceptions.base.MockitoException: Unable to initialize @Spy annotated field 'allRequestParams'配置失败:@BeforeClass 设置 org.mockito.exceptions.base.MockitoException:无法初始化 @Spy 注释字段“allRequestParams”
【发布时间】:2016-03-16 19:58:55
【问题描述】:

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

【问题讨论】:

    标签: java spring-mvc jpa junit testng


    【解决方案1】:

    我认为下面的声明有问题

    @Spy
    Map<String, String> allRequestParams;
    

    Map 上“窥探”是没有意义的。 “间谍”对象是从“真实”对象创建的,默认情况下,间谍上的调用方法会调用真实对象上的相同方法。创建 spy 后,您可以根据需要更改 spy 上某些方法的行为。但是,由于Map 是一个接口,因此您没有真正的对象开始,因此如果方法的行为没有改变,Mockito 无法创建“间谍”将调用的对象。

    相反,您可以模拟地图,使用

    @Mock
    Map<String, String> allRequestParams;
    

    或者忘记这个集合的模拟和间谍,只使用HashMap&lt;String, String&gt;

    就个人而言,我会选择HashMap 方法。我真的不认为需要模拟像集合类一样对 Java 至关重要的类。可以安全地假设它们将按照指定的方式运行,并且没有它们也很难以 Java 代码的方式编写很多内容。

    【讨论】:

      猜你喜欢
      • 2016-12-25
      • 2012-10-05
      • 2020-06-24
      • 2017-02-23
      • 1970-01-01
      • 2011-09-20
      相关资源
      最近更新 更多