Макет встроенных объектов в интеграционном тесте - PullRequest
1 голос
/ 15 марта 2019

Попытка написать интеграционный тест для приложения 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 Ответ

1 голос
/ 15 марта 2019

Достигните этого, используя SpringRunner и @MockBean

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

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

Аннотация, которую можно использовать для добавления макетов в Spring ApplicationContext. Может использоваться как аннотация уровня класса или для полей либо в классах @Configuration, либо в тестовых классах, которые являются @RunWith 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()
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...