当前位置: 首页 > 知识库问答 >
问题:

Mockito ClassCastException-无法投射模拟

宰父浩漫
2023-03-14

我想在类AppleProcessor中测试一个方法:

public void process(Fruit fruit) {
    if(fruit.getType() == Fruit.APPLE) {
        fruitBasket.add(((AppleFruit) fruit).getApple());
    }
    else {
        // do something else
    }
}

请注意,Fruit是AppleFruit实现的方法getType()的接口,并且还有一个getApple()方法。

我的测试看起来像:

@Mock
FruitBasket fruitBasket;

@Mock
Fruit fruit;

@Mock
AppleFruit apple;

@Before
public void setUp() {
    MockitoAnnotations.initMocks(this);
}

@Test
public void testAnAppleIsProcessed() {
    AppleProcessor appleProcessor = new AppleProcessoer();
    when(fruit.getType()).thenReturn(Fruit.APPLE);
    when(((AppleFruit) fruit).getApple()).thenReturn(apple);

    appleProcessor.process(fruit);

    verify(fruitBasket).add(isA(Apple.class));
}

然而,我得到了以下错误:

java.lang.ClassCastException:package.fruit。水果$$EnhancerByMockitoWithCGLIB$$b8254f54不能强制转换为包装。水果。苹果柚

它来自测试中的这一行

当(((AppleFruit)水果). getApple()). then返回(苹果);

有人知道如何解决这个问题,以便我可以测试我的代码吗?


共有3个答案

胥和悌
2023-03-14

Mockito可以处理在模拟时(赋值)已经强制转换的模拟对象。但是,它不会在代码执行期间自行强制转换模拟对象。

换句话说(最好是代码):

Fruit fruit = Mockito.mock(Applefruit.class);

照我说的做,你会没事的。我有一个类似的问题,他的解决方案奏效了。

对于这个问题,它将是:

@Mock
FruitBasket fruitBasket;

@Mock
AppleFruit fruit; // changed here

@Mock
AppleFruit apple;

@Before
public void setUp() {
    MockitoAnnotations.initMocks(this);
}

@Test
public void testAnAppleIsProcessed() {
    AppleProcessor appleProcessor = new AppleProcessoer();
    when(fruit.getType()).thenReturn(Fruit.APPLE);
    when(((AppleFruit) fruit).getApple()).thenReturn(apple);

    appleProcessor.process(fruit);

    verify(fruitBasket).add(isA(Apple.class));
}

这就是所需要的一切。

唐珂
2023-03-14

对于搜索此内容的任何人,只需包括:

@Mock(extraInterfaces = {AppleFruit.class})
Fruit fruit;

这将为模拟添加一个额外的界面,演员阵容不会引发任何异常

甘西岭
2023-03-14

当你说

@Mock
Fruit fruit;

你告诉Mockito:果子变量应该是果子的一个实例。Mockito将动态创建一个实现果子的类(这个类是果子$$EnhancerByMockitoSusCGLIB$$b8254f54),并创建这个类的实例。这个类没有理由成为AppleFruit的实例,因为你没有告诉Mockito对象必须是AppleFruit类型。

将其声明为Applefuit,其类型为Applefuit。

 类似资料:
  • 问题内容: 我想从数据库中获取价值,就我而言,我曾经从数据库中获取价值,但是却遇到了这个错误 这是我的代码 任何帮助将是荣幸:) @raffian,你的意思是这样吗? 问题答案: 问题是 这将返回一个 对象数组 列表 (Object []), 其中包含表中每一列的标量值。Hibernate将使用ResultSetMetadata推断返回的标量值的实际顺序和类型。 解 相关连结 使用迭代器

  • 问题内容: 为什么在我的程序中触发java.lang.ClassCastException? java.lang.ClassCastException:[Ljava.lang.Object; 无法转换为com.App.Equip] 该查询返回已回答(在CheckLists calsse中找到)但尚未由Equip对象回答的清单的列表 -这是代码: -我的java类: 我想将我的SQl查询的结果格式化

  • 问题内容: Group.java 这是我的方法。 我认为还可以,但是有一些例外: HTTP状态500 –内部服务器错误h1 {font-family:Tahoma,Arial,sans-serif; color:white; background-color:#525D76; font-size:22px;} h2 {font-family:Tahoma,Arial,sans- 衬线;颜色:白色;

  • 本文向大家介绍Swift投射,包括了Swift投射的使用技巧和注意事项,需要的朋友参考一下 示例 将函数应用于集合/流并创建新的集合/流称为投影。            

  • 我不熟悉匕首和莫基托。我尝试在单元测试中使用Dagger模块中定义的构造函数,以便使用默认值创建对象。 这是模块: @模块类自动关闭倒计时模块{ 这就是我在单元测试中模拟AutoCloseCountDown类的方法: @RunWith(MockitoJUnitRunner.class)公共类AutoCloseCountDownTimerTest{ 如何实现自动关闭的CountDownTimer将在

  • 这个类用于进行raycasting(光线投射)。 光线投射用于进行鼠标拾取(在三维空间中计算出鼠标移过了什么物体)。 代码示例 const raycaster = new THREE.Raycaster(); const mouse = new THREE.Vector2(); function onMouseMove( event ) { // 将鼠标位置归一化为设备坐标。x 和 y 方向的