mockito和powermockito在模拟groovy测试文件时抛出AbstractMethodError

时间:2015-07-29 15:47:21

标签: unit-testing groovy mockito powermockito

我试图模拟最终的类(java.net.URL)并在一个非常简单的Wrapper类中使用它:ClassToTest.groovy。测试器类在下面给出,它是:ClassToTestTester.groovy。

package com.icidigital.services.impl;

import java.net.HttpURLConnection;
import java.net.URL;

/**
 * Created by apil.tamang on 7/29/15.
 */
public class ClassToTest {

    private URL url;

    public ClassToTest(URL obj){

        this.url=obj;
    }

    public String returnUserInfo() throws Exception{


        String userInfo=url.getUserInfo();
        println("Got user info: "+userInfo);
        return userInfo;
    }
}


package com.icidigital.services;

import static org.junit.Assert.*;

import com.icidigital.services.impl.ClassToTest;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;


@RunWith(PowerMockRunner.class)
@PrepareForTest([ URL.class, HttpURLConnection.class, ClassToTest.class ])
public class ClassToTestTester {

    @Test
    public void setUp() throws Exception{
        //========================================
        //define a mock url instance
        URL mockURL=PowerMockito.mock(URL.class);

        //define behavior for openConnection method
        PowerMockito.doReturn("apil.tamang").when(mockURL).getUserInfo();

        //========================================
        //setup a test class
        ClassToTest testClass=new ClassToTest(mockURL);

        /*call the method to test in testtClass
         *Throws exception: AbstractMethodError, why??
         *
         * URL.openConnection() is NOT an abstract method, besides
         * I've defined a stub for  'mockURL' to return
         * 'mockConn' when its openConnection() method is called.
         */
        String result=testClass.returnUserInfo();

        assertEquals(result,"apil.tamang");
    }

}

正如您所看到的,我在这里尝试完成的所有工作都是通过(非常)简单的测试工作流程来完成的,该工作流程包含

  1. 定义模拟(mockURL)
  2. getUserInfo
  3. 定义方法存根
  4. 测试方法:testClass.returnUserInfo()
  5. 不幸的是,在被测试的类中(也称为System Under Test或SUT):ClassToTest,在运行时,url.getUserInfo()返回一个空字符串。这里发生的是在@Test方法中作为构造函数传递的mockURL对象没有被持久化。相反,类加载器将新的URL实例加载到SUT中。我之所以相信这是因为我也没有NullPointerException!我得到的只是userInfo中的一个空字符串,否则应该说#apil.tamang'。

    此外,使用.java扩展名编写的相同文件也可按预期工作。即运行相同的ClassToTestTester次传递。

    我在这里做错了什么?我错过了一个明显的错误吗?

0 个答案:

没有答案