Макет встроенных объектов в интеграционном тесте

#java #spring #mockito

#java #spring #mockito

Вопрос:

Пытаюсь написать интеграционный тест для приложения Spring. Допустим, у меня есть класс A, который содержит объект класса B. Класс B содержит объект класса C, и мне нужно создать макет объекта внутри этого класса для интеграционного теста — есть идеи, как я могу это сделать, не передавая каждый объект в качестве параметра в конструкторе?

например

 @Service
Class A {
    @Autowired
    private B b;

    public void testA() {
        B.testB();
    }
}

@Service
Class B {
    @Autowired
    private C c;

    public void testB() {
        c.testC();
    }
}

@Service
Class C {

    //External class pulled in from dependency library
    @Autowired
    private RestTemplate restTemplate;

    public void testC() {
        restTemplate.doSomethingInOutsideWorld();
    }
}
  

Интеграционный тест:

 @RunWith(JUnitParamsRunner.class)
@SpringBootTest
public class MyIt {

    @ClassRule
    public static final SpringClassRule SPRING_CLASS_RULE = new SpringClassRule();

    @Rule
    public final SpringMethodRule springMethodRule = new SpringMethodRule();


    @Mock
    private RestTemplate restTemplate;

    @Autowired
    private A a;

    @InjectMocks
    private C c;

    @Before
    public void setup() {
        initMocks(this);
    }

    @Test
    public void test1() throws IOException {
        a.testA()
    }
}
  

Не имитирует RestTemplate объект, он пытается воздействовать на внешний мир. Есть какие-нибудь советы о том, как это решить?

Ответ №1:

Добейтесь этого с помощью SpringRunner и @MockBean

@RunWith(SpringRunner.class ) используется для обеспечения моста между функциями Spring Boot test и JUnit. Всякий раз, когда мы используем какие-либо функции тестирования Spring Boot в наших тестах JUnit, эта аннотация будет обязательной.

Аннотацию @SpringBootTest можно использовать, когда нам нужно загрузить весь контейнер. Аннотация работает путем создания ApplicationContext, который будет использоваться в наших тестах.

Аннотация, которая может использоваться для добавления макетов в Spring ApplicationContext. Может использоваться в качестве аннотации уровня класса или в полях либо в классах @Configuration, либо в тестовых классах, которые выполняются с помощью SpringRunner.

 @RunWith(SpringRunner.class)
@SpringBootTest
public class MyIt {

@MockBean
private RestTemplate restTemplate;

@Autowired
private A a;


@Before
public void setup() {
    initMocks(this);
}

@Test
public void test1() throws IOException {

    given(this.restTemplate.doSomethingInOutsideWorld()).willReturn(custom object);
    a.testA()
   }
}