JUnit Mockito Testing and Spying 2 отдельных метода - PullRequest
0 голосов
/ 31 мая 2018

У меня есть класс обслуживания, для которого я хочу написать тесты junit.Вот этот класс обслуживания:

public class FooService {
  private BarService barService;

  public FooService(BarService barService) {
    this.barService = barService;
  }

  public Foo methodOne(int a) {
    double value = methodTwo();
    //do some other stuff and return Foo
  }

  public double methodTwo() {
    //do stuff
  }
}

Вот мой тест junit:

public class FooServiceTest {
  @Mock
  BarService barService;
  FooService fooService;

  @Before
  public void init() {
    MockitoAnnotations.initMocks(this);
    fooService = Mockito.spy(new FooService(barService));
    doReturn(1.0).when(fooService).methodTwo();
    doCallRealMethod().when(fooService).methodOne(1);
  }

  @Test
  public void test() {
    fooService.methodOne(1);
    assertThat(.....)
  }
}

Моя проблема в том, что когда я запускаю свой тест, он на самом деле никогда не вызывает methodOne.Он просто пропускает все в FooService и переходит непосредственно к строке asserThat(...).У меня есть ощущение, что это как-то связано с шпионажем на объекте fooService.

Как я могу написать тест junit для этого FooService, где я делаю реальный вызов methodOne, но я высмеиваю возвращение methodTwo?

1 Ответ

0 голосов
/ 30 июня 2018

Я думаю, вы сделали это немного сложнее.И вы были правы насчет spy:

public class FooService {

    BarService barService;

    public FooService(BarService barService) {
        this.barService = barService;
    }

    public String methodOne(int a) {
        double value = methodTwo();
        return "Hello from method 1 - " + value;
    }

    public double methodTwo() {
        return 1;
    }
}


public class MyTest {

    private BarService barService = Mockito.mock(BarService.class);
    private FooService fooService = Mockito.spy(new FooService(barService));

    @Test
    void test() {
       doReturn(7.0).when(fooService).methodTwo();
       String result = fooService.methodOne(1);
       assertThat(result).isEqualTo("Hello from method 1 - 7.0");
    }

}

Если вы используете шпионов, все немодированные методы будут "настоящими".Так что не надо говорить doCallRealMethod().

...