Как издеваться над Mono.create - PullRequest
0 голосов
/ 09 мая 2019

Я использую фреймворк спока, и мне нужно вернуть моно из Mono.create (..)

Я пробовал:

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)
                } 
            }
    )
}

Ответы [ 2 ]

0 голосов
/ 13 мая 2019

Дмитрий Хамитов уже показал вам, как использовать PowerMock в Java + JUnit, я хочу завершить картину, предоставив MCVE в Grovy + Spock для вашего удобства:

package de.scrum_master.stackoverflow.q56064582;

import reactor.core.publisher.Mono;

public class ReactorSample {
  public Mono<String> doSomething() {
    return Mono.just("foo");
  }
}
package de.scrum_master.stackoverflow.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 методам.

0 голосов
/ 09 мая 2019

В Spock вы можете только макетировать статические методы классов Groovy, а не классов Java. В этом случае вы можете использовать PowerMock (ito) для классов Java. Тогда ваша проблема может быть решена следующим образом:

@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
    }
}
...