我面临一个类转换异常,从java.lang.Double到java.lang.Integer

时间:2017-04-25 04:37:36

标签: java unit-testing junit mockito classcastexception

我正在为一个方法编写一个JUnit测试用例,该方法有getValue()方法返回一个Object,getValue()返回我在setValue()内传递的值,在这种情况下,当我将double值传递给setValue()它会产生类强制转换异常。我无法弄清楚如何解决这个问题。

这是我正在测试的if条件,

Public class ImageToolsMemento 
{
    public static final int FREEROTATION=3;
     private double _freeRotation;
    public void combine(ImageToolsMemento obj) //test method
    {
       if(((Integer)(obj.getValue(FREEROTATION))).intValue() != 0)//line 224
            _freeRotation = ((Integer)(obj.getValue(FREEROTATION))).intValue();
    }

public Object getValue(int type)
   {
     Object ret;
     switch(type)
     {
       case FREEROTATION:

       default:
         ret = null;
     }
     return ret;
   }

public void setValue(double value, int type)
  {
    switch(type)
    {
      case FREEROTATION:
          _windowPanelMemento.setValue(value, type);
          break;
      default:
            //"default case"
            break;
    }
 }
}

测试用例

public class ImageToolsMementoTest 
{
    @InjectMocks
    ImageToolsMemento imageToolsMemento;

    @Before
    public void setUp() throws Exception 
    {
        imageToolsMemento=new ImageToolsMemento();
    }

   @Test
    public void testCombine() 
    {
      imageToolsMemento.setValue(1.3, ImageToolsMemento.FREEROTATION);
      imageToolsMemento.combine(imageToolsMemento);//calling test method, line 553
      double _freeRotation=Whitebox.getInternalState(imageToolsMemento, "_freeRotation");
        assertEquals(1.3,_freeRotation,0.0);
    }
}

堆栈跟踪

java.lang.ClassCastException: java.lang.Double cannot be cast to java.lang.Integer
    at com.toolboxmemento.ImageToolsMemento.combine(ImageToolsMemento.java:224)
    at com.toolboxmemento.test1.ImageToolsMementoTest.testCombine(ImageToolsMementoTest.java:553)

任何人都可以帮我解决这个问题 P.S我无法改变实施

2 个答案:

答案 0 :(得分:0)

在java中,您无法将java.lang.Double投射到java.lang.Integer。你的错误就行了:

if(((Integer)(obj.getValue(FREEROTATION))).intValue() != 0)//line 224

您可以使用intValue类的Double方法代替演员:

if(((Double)obj.getValue(FREEROTATION)).intValue() != 0)//line 224

答案 1 :(得分:0)

您需要执行显式类型转换,因为double不会隐式存储在int类型中。您可以通过以下方式执行此操作: int i =(int)d;