如何模拟 Mono.create
How to mock Mono.create
我正在使用 spock 框架,需要 return 来自 Mono.create(..)
的模拟 Mono
我试过:
GroovyMock(Mono)
以及
GroovyMock(Mono, global:true)
1 * Mono.create(_ as MonoSink) >> Mono.just(returnedValue)
但是我得到的消息是上面代码的断言太少了。
这是实际的 Mono.create 代码
Mono.create{ sink ->
myAPISoap.getStuffAsync(
username,
password,
info,
{ outputFuture ->
try {
sink.success(outputFuture.get())
} catch(Exception e){
sink.error(e)
}
}
)
}
在 Spock 中,在这种情况下,您只能为 Java 类 模拟 static methods of Groovy classes, not Java classes. You can use PowerMock(ito)。那么你的问题可以这样解决:
@RunWith(PowerMockRunner.class)
@PrepareForTest(Mono.class)
public class MonoTest {
@Test
public void test() {
//given:
PowerMockito.spy(Mono.class);
Mockito.when(Mono.create(...)).thenReturn(null);
//when:
Mono<?> mono = Mono.create(...);
//then:
PowerMockito.verifyStatic(Mono.class, Mockito.times(1));
Mono.create(...);
//assertions
}
}
Dmitry Khamitov 已经向您展示了如何在 Java + JUnit 中使用 PowerMock,我想通过在 Groovy + Spock 为了您的方便:
package de.scrum_master.Whosebug.q56064582;
import reactor.core.publisher.Mono;
public class ReactorSample {
public Mono<String> doSomething() {
return Mono.just("foo");
}
}
package de.scrum_master.Whosebug.q56064582
import org.junit.runner.RunWith
import org.powermock.core.classloader.annotations.PrepareForTest
import org.powermock.modules.junit4.PowerMockRunner
import org.powermock.modules.junit4.PowerMockRunnerDelegate
import org.spockframework.runtime.Sputnik
import reactor.core.publisher.Mono
import spock.lang.Specification
import static org.mockito.Matchers.anyString
import static org.powermock.api.mockito.PowerMockito.mockStatic
import static org.powermock.api.mockito.PowerMockito.when
@RunWith(PowerMockRunner.class)
@PowerMockRunnerDelegate(Sputnik.class)
@PrepareForTest([Mono.class])
class ReactorSampleTest extends Specification {
def "test me"() {
given:
def dummy = Mono.just("power-mocked")
mockStatic(Mono.class)
when(Mono.just(anyString())).thenReturn(dummy)
def sut = new ReactorSample()
expect:
sut.doSomething() == dummy
}
}
您可以轻松地将其改编为其他静态 Mono
方法。
我正在使用 spock 框架,需要 return 来自 Mono.create(..)
的模拟 Mono我试过:
GroovyMock(Mono)
以及
GroovyMock(Mono, global:true)
1 * Mono.create(_ as MonoSink) >> Mono.just(returnedValue)
但是我得到的消息是上面代码的断言太少了。
这是实际的 Mono.create 代码
Mono.create{ sink ->
myAPISoap.getStuffAsync(
username,
password,
info,
{ outputFuture ->
try {
sink.success(outputFuture.get())
} catch(Exception e){
sink.error(e)
}
}
)
}
在 Spock 中,在这种情况下,您只能为 Java 类 模拟 static methods of Groovy classes, not Java classes. You can use PowerMock(ito)。那么你的问题可以这样解决:
@RunWith(PowerMockRunner.class)
@PrepareForTest(Mono.class)
public class MonoTest {
@Test
public void test() {
//given:
PowerMockito.spy(Mono.class);
Mockito.when(Mono.create(...)).thenReturn(null);
//when:
Mono<?> mono = Mono.create(...);
//then:
PowerMockito.verifyStatic(Mono.class, Mockito.times(1));
Mono.create(...);
//assertions
}
}
Dmitry Khamitov 已经向您展示了如何在 Java + JUnit 中使用 PowerMock,我想通过在 Groovy + Spock 为了您的方便:
package de.scrum_master.Whosebug.q56064582;
import reactor.core.publisher.Mono;
public class ReactorSample {
public Mono<String> doSomething() {
return Mono.just("foo");
}
}
package de.scrum_master.Whosebug.q56064582
import org.junit.runner.RunWith
import org.powermock.core.classloader.annotations.PrepareForTest
import org.powermock.modules.junit4.PowerMockRunner
import org.powermock.modules.junit4.PowerMockRunnerDelegate
import org.spockframework.runtime.Sputnik
import reactor.core.publisher.Mono
import spock.lang.Specification
import static org.mockito.Matchers.anyString
import static org.powermock.api.mockito.PowerMockito.mockStatic
import static org.powermock.api.mockito.PowerMockito.when
@RunWith(PowerMockRunner.class)
@PowerMockRunnerDelegate(Sputnik.class)
@PrepareForTest([Mono.class])
class ReactorSampleTest extends Specification {
def "test me"() {
given:
def dummy = Mono.just("power-mocked")
mockStatic(Mono.class)
when(Mono.just(anyString())).thenReturn(dummy)
def sut = new ReactorSample()
expect:
sut.doSomething() == dummy
}
}
您可以轻松地将其改编为其他静态 Mono
方法。