Метод из осмеянного компонента не работает правильно - PullRequest
0 голосов
/ 06 июля 2019

Я хочу создать модульный тест для метода в сервисе, что означает, что я не хочу использовать @RunWith(SpringRunner.class), хотя это решило бы мою проблему.

Вот как выглядит моя программа:

    @Service
    public class MyService {
      private final SomeBean someBean;
      public MyService(SomeBean someBean) {
        this.someBean = someBean;
      }
      public boolean functionToTest() {
        boolean b = someBean.innerFunction();  // inside innerFunction() I return always true;
        return b;
        }
      }
    }

    public class SomeBean extends BaseBean {
      private String value;  // getter, setter
      public SomeBean(String value) {      //this value is always null in test
        super();
        this.value = value;
      }
      public boolean innerFunction() {
        return true;
      }
    }

    @Configuration
    public class SomeBeanConfiguration {
      @Bean
      public SomeBean getSomeBean(@Value("${prop.value}") String value) {
        return new SomeBean(value);  //can't get here while debugging test
      }
    }

И вот как я хочу проверить functionToTest():

    @RunWith(MockitoJUnitRunner.class)
    public class MyTest {

      @InjectMocks
      MyService service;

      @Mock
      SomeBean someBean;

      @Before
      public void setUp(){
        MockitoAnnotations.initMocks(this);    //although result is the same even without this set up
      }

      @Test
      public void test() {
        assertTrue(service.functionToTest());
      }
    }

Проверка всегда заканчивается неудачей, поскольку boolean b по умолчанию false, и я не могу попасть в innerFunction () с помощью отладчика.

Есть ли способ издеваться над бобами для такого рода модульного тестирования?

1 Ответ

0 голосов
/ 06 июля 2019

Вы используете MockitoJUnitRunner, поэтому ваша конфигурация Spring не запускается во время тестов - контекст не создается. Но это не главная проблема, так как вы хотите провести модульное тестирование своей логики.

Если вы хотите провести модульное тестирование своих Spring Bean, которое будет взято из Spring Context, вы, вероятно, будете использовать аннотации SpringJUnit4ClassRunner (для JUnit4) и @MockBean (доступно только в Spring Boot) для насмешливых bean-компонентов в Spring Context для тестов.

Когда вы создаете макет - с помощью mockito - вы должны фактически сказать, что должен делать этот макет, когда к нему вызывается метод. Например:

Mockito.when(someBean.innerFunction()).thenReturn(true);

Здесь вы говорите: «Когда метод innerFunction вызывается для моего фиктивного объекта, пожалуйста, верните true».

Итак, ваш тест может выглядеть так:

@Test
public void test() {
    Mockito.when(someBean.innerFunction()).thenReturn(true);
    assertTrue(service.functionToTest());
}

Кроме того, вам не нужно использовать MockitoAnnotations.initMocks(this) в аннотированном методе @Before, поскольку вы уже используете аннотацию @InjectMocks.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...