gpt4 book ai didi

java - 使用 Mokito 时,实际对象和模拟对象有什么区别?

转载 作者:行者123 更新时间:2023-12-01 06:38:11 26 4
gpt4 key购买 nike

在下面的程序中,我尝试使用mockitojunit在我的测试用例中。但我不明白 Mokito 如何帮助我的测试创建对象?我在这里没有看到任何特别的东西,因为看起来 mokito 正在实例化实际的对象。

   public class TestCase1{

@Mock
MyClass myClass;

public void setup(){

MokitoAnnotations.initMoks(this);

}
@Test
public void testAddition(){

when(myClass.add(2,2)).thenReturn(20);
assertEquals(4,myClass.add(2,2));
}
}

我的实际类(class)(MyClass.java)

    public class MyClass{
public int add(int x, int y){
return x+y;
}
}

它是模拟对象,与注入(inject)(DI)对象相同吗?感谢您的帮助!

最佳答案

您的测试不会测试您的任何代码。它测试 Mockito 是否正常工作。

当我介绍模拟的概念时,我举了一个例子:假设您构建了一个雷管,并想要测试它。你当然可以将雷管与真正的炸弹一起使用,看看当你使用雷管时整个方 block 是否爆炸。但这不太实用。顺便说一句,也许你甚至没有可用的炸弹。也许您的同事仍在构建它。

所以你使用了模拟炸弹。请注意重要的一点:要测试雷管,您需要使用模拟炸弹。不是模拟雷管。被模拟的是被测类的依赖。不是被测试的类本身。

什么是模拟炸弹?这只是一个假炸弹,没有任何作用。它所做的只是验证是否已被要求爆炸。因此,测试雷管的代码如下所示:

// create a mock bomb:
Bomb mockBomb = mock(Bomb.class);
// create a real detonator, but tie it to the mock bomb:
Detonator detonator = new Detonator(mockBomb);

// test the detonator. Since it's tied to a mock bomb, the block
// won't explode
detonator.pressTheRedButton();

// check it the mock bomb has been asked to explode, as it should
// if the detonator works correctly
verify(mockBomb).explode();

现在,如果测试通过,您就知道 pressTheRedButton() 中使用的所有内部电路工作正常并最终让炸弹爆炸。所以你知道,当与真实炸弹一起使用时,按下红色按钮时真实炸弹也会爆炸。

现在让我们回到现实世界:您想要测试一个服务,而该服务使用一个 DAO,该 DAO 需要一个填充了数据的数据库才能正常运行。要测试您的服务,您可以简单地模拟 DAO,并验证它是否正常工作。模拟 DAO 还可以用作 stub ,即返回您告诉它在测试中返回的内容的对象,而不是实际查询数据库。这就是您在问题代码中所做的事情:您告诉模拟 MyClass 实例,当 add() 时使用 2 和 2 作为参数调用,它应该返回 4。

这使得测试更容易设置、运行更快,并且独立于 DAO 的实际代码,而这不是您想要在服务的单元测试中测试的内容。

关于java - 使用 Mokito 时,实际对象和模拟对象有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28783722/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com