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