【发布时间】:2018-12-14 16:34:04
【问题描述】:
我对 mockito 框架相当陌生。我一直在阅读有关它的多个教程。我关注的其中之一是:https://www.tutorialspoint.com/mockito/mockito_first_application.htm
有一个创建 Stock Service 模拟的语句。
In this example, we've created a mock of Stock Service to get the dummy price of some stocks
我的问题是 Stock Service 是 a real service class 或 mock service class 你必须手动站起来模仿真实的服务类。我有点困惑。对junit框架有基本的了解。我之前练习的是,如果有一个服务类Foo,那么我使用提供所有公开方法的实际类。
public class Foo {
public Foo() { } // construtor
public String returnAddress(String userId) {
// ...
return dataAccesobj.getAddress(userId);
}
}
如果我没记错的话,在单元测试中调用foo.returnAddress(..)。
我问这个问题的原因是当我使用mockito为一个类创建一个测试方法时,我遇到了一个独特的(?)挑战。
我从一个真正的服务类开始,它依赖于它的超类构造函数来返回它的实例。我遇到的挑战是这个超类构造函数启动数据库连接和加载/解析我的测试不需要的属性文件。我正在考虑如何防止数据库连接和加载/读取道具文件....
我想我读过mockito 教程之一,您可以在没有此类服务的情况下隔离测试。我尝试使用@Mock 和@Spy(还没有完全理解它们的用途......)但它对输出没有影响(也许我滥用了这些注释)。
所以我所做的实际上是从真实服务类(例如Foo)中创建假/模拟类,只需复制它并将其重命名为FooMock,并将其放入单元测试类所在的src/test/java文件夹中从运行。除了去掉不需要的逻辑,例如db connection 或loading/reading prop file for env specific,我保持模拟类与真实服务类完全相同。通过这样做,我能够测试读取 ldap 目录的公开方法之一......
很抱歉我跑题了,但希望我的观点在这一点上是明确的。我不确定我处理这种情况的方式是对还是错。我希望有经验的工程师能澄清我处理此事的方式是否可以以mockito 的方式接受。如果没有,请告诉我最好的处理方法。
【问题讨论】:
-
Foo mockFoo = Mockito.mock(Foo.class)...当您调用时,您会看到它调用构造函数吗?每 this question mockito 不调用构造函数本身。我不清楚你的问题是什么。 -
如果描述不清楚,我深表歉意。是的,它触发
Foo的私有构造函数,该构造函数调用其父类的super()。顺便说一句 -Foo类使用单例模式。我使用注释InjectMocks代替返回Foo实例顺便说一句。 -
我尝试了
Foo fooMock = Mockito.mock(Foo.class),然后它抛出了一个异常Cannot mock/spy class Foo Mockito cannot mock/spy following: final classes。确实是final类。 -
您可能会考虑使用 PowerMockito 来解决最终类限制。
标签: java unit-testing mockito