如何模拟 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 方法。