Я тестирую класс, который зависит от bean-компонента. В тесте я издеваюсь над bean-компонентом, но у имитируемого bean-компонента также есть собственная зависимость @Autowired. Есть ли способ удовлетворить эту зависимость? Как и сейчас, зависимость @Autowired равна нулевой, когда вызывается метод в макете.
Пример:
public class testclass {
@Autowired
private ClassToTest classToTest;
@MockBean
private DependencyOfClassToTest dependencyOfClassToTest;
@Mockbean
private MyOwnDependencyINeedHereInTheMock myOwnDependencyINeedHereInTheMock;
}
public class DependencyOfClassToTest {
@Autowired
private MyOwnDependencyINeedHereInTheMock myOwnDependencyINeedHereInTheMock;
}
Как видно выше, имитированный компонент содержит зависимость @Autowired.
Любые решения для этого или я нарушаю какое-то правило тестирования?
Когда вызывается фактический метод в имитированном bean-компоненте, он вызывает myOwnDependencyINeedHereInTheMock, который будет нулевым, потому что это mockbean.
MockBeans не является нулевой в классе @Autowired, поэтому Spring Boot их находит.
@DaveyDaveDave Да, я не передаю bean-компонент тестируемому классу каким-либо другим способом, кроме этой аннотации.
Я думаю, вам может понадобиться показать больше кода — можете ли вы отредактировать свой пост, чтобы включить тест (надеюсь, MCVE)? Кроме того, откуда вы знаете, что MyOwnDependencyINeedHereInTheMock равно нулю?
Если вы вызываете метод для издевательского объекта, он всегда будет возвращать нулевое значение, возможно, вы думали, что это происходит из-за того, что ваш MyOwnDependencyINeedHereInTheMock не был автоматически подключен, но похоже, что вы не знали, как использовать моки. Вы должны предопределить поведение вызываемого метода. В этом случае, если вы вызываете метод, он должен вернуть ваше предопределенное значение, и не имеет значения, что находится внутри имитируемого объекта (я имею в виду MyOwnDependencyINeedHereInTheMock, а другие объекты могут быть нулевыми). В противном случае что-то не так с вашей тестовой конфигурацией, и вы вызываете методы для реального объекта.




Издевайтесь над этим бобом тоже!
public class testclass {
@Autowired
private ClassToTest classToTest;
@MockBean
private DependencyOfClassToTest dependencyOfClassToTest;
@MockBean
private MyOwnDependencyINeedHereInTheMock myOwnDependencyINeedHereInTheMock;
}
public class DependencyOfClassToTest {
@Autowired
private MyOwnDependencyINeedHereInTheMock myOwnDependencyINeedHereInTheMock;
}
Обновить: нижеприведенный тестовый класс работает для меня
@RunWith(SpringRunner.class)
@SpringBootTest
public class ApplicationTests {
@Autowired
private ClassToTest classToTest;
@MockBean
private DependencyOfClassToTest dependencyOfClassToTest;
@MockBean
private MyOwnDependencyINeedHereInTheMock myOwnDependencyINeedHereInTheMock;
@Test
public void contextLoads() {
System.out.println("test"+myOwnDependencyINeedHereInTheMock);
}
@TestConfiguration
static class Context{
@Component
static class ClassToTest{
@Autowired
private DependencyOfClassToTest dependencyOfClassToTest;
}
@Component
static class DependencyOfClassToTest{
@Autowired
private MyOwnDependencyINeedHereInTheMock myOwnDependencyINeedHereInTheMock;
}
@Component
static class MyOwnDependencyINeedHereInTheMock{
}
}
}
Я пробовал это, но это не работает. MockBeans не равен нулю только в поле @Autowired.
в приведенном вами примере ClassToTest должен быть тестируемым классом, и в нем должен быть автоматически подключен DependencyOfClassToTest, чего нет.
Вы уверены, что ваш тест использует имитированную версию компонента? Если это так, то внутренности «настоящего» bean-компонента не должны иметь значения, тот факт, что реальный bean-компонент имеет другие зависимости, не имеет значения, в этом весь смысл макета.