【发布时间】:2019-10-15 11:48:31
【问题描述】:
我有一个 java 应用程序(里面没有 Spring),我想用集成测试来测试它。
我的主要用例是使用指定输入在数据库上做一些事情并将一些请求发送到两个不同的服务,一个 SOAP 和一个 REST 的主要功能。
现在我有一个有效的 JUnit 配置(在单元和集成测试中拆分)+ io.fabric8:docker-maven-plugin 在集成测试期间使用数据库的 docker 映像。
我要做的是为这两个服务添加一个模拟,特别是用于直接调用外部服务的方法。
最大的问题是我有这个结构:
class A{
Result mainFunction(Request r){
....
B b = new B(params);
b.logEvent(someParameters)
....
}
}
class B{
int logEvent(Object someParameters){
....
NotifierHandler nh = new NotifierHandler(param1);
nh.sendNotification(json);
....
}
}
我在哪里:
class NotifierHandler{
String sendNotification(Json j){
...
[call to REST service with some parameters]
...
...
[call to SOAP service with some parameters]
...
}
}
我需要什么:调用 A.mainFunction(r),在测试环境中将 NotifierHandler 替换为 FakeNotifierHandler 和/或更改方法 sendNotification() 的行为。
实际问题:现在使用 Mockito 和 PowerMock 我遇到的问题是我无法使用 FakeNotifierHandler 全局直接更改类 NotifierHandler。同样试图改变方法的行为。
特别是,我需要创建一个
class FakeNotifierHandler{
String sendNotification(Json j){
...
[save on an HashMap what I should send to the REST service]
...
...
[save on another HashMap what I should send to the SOAP service]
...
}
}
阅读我尝试过的所有示例,我只看到了更改方法返回值的简单示例,而不是更改一个类的一个方法的行为,另一个类和另一个我用作集成测试起点的方法.
注意:可能有一种快速的方法可以做到这一点,但我对这种类型的测试(Mockito、PowerMock 等)非常陌生,我没有找到这种特殊情况的示例。
编辑:与How to mock constructor with PowerMockito 不相似,因为我需要更改方法的行为,而不仅仅是返回值。
提前非常感谢
【问题讨论】:
-
Mocking 并不是为了改变行为。您模拟外部事物,以这样的方式在使用特定输入调用时以特定值响应 - 正是您所说的“更改方法的返回值”。目前还不清楚你真正想在那里测试什么,你能更详细地解释一下吗?
-
嗨,就像帖子的主题一样,我想要在测试期间更改一个类与另一个类(NotifierHandler-->FakeNotifierHandler),以便与原始的'sendNotification( )' 方法,例如绕过网络调用并将它们存储到文本文件中。对不起,如果我不完全清楚。非常感谢
-
如果您使用的是 Mockito,那么从概念上讲,这种更改需要您更改主代码逻辑:github.com/mockito/mockito/wiki/Mocking-Object-Creation -- 您可以使用 powermock 代替:github.com/powermock/powermock/wiki/MockConstructor。另外,从技术上讲,您的问题似乎是重复的,所以我现在将其标记为这样。
-
对我来说不,我不仅需要改变结果,还需要改变方法的行为
标签: java junit mockito integration-testing powermock