Как издеваться над дополнительным бобом в весенней загрузке? - PullRequest
2 голосов
/ 25 февраля 2020

В моем SpringBootApplication у меня есть bean, который вводит другой необязательный компонент (как показано ниже)

@Service
public class A {

    //B is another @Component from one of the dependencies
    private Optional<B> b;
    ...
    ...
}

Я пишу интеграционный тест для class A, где мне нужно @MockBean Optional<B> b. Однако, поскольку Optional является последним классом, весенний мокито поднимает следующую ошибку

Невозможно издеваться / шпионский класс java .util.Optional - финальный класс

Есть ли способ обойти это? Любая помощь очень ценится.

Ответы [ 3 ]

2 голосов
/ 25 февраля 2020

Вы можете использовать Optional.of(b).

Если вы используете mockito с аннотациями, вы не можете использовать @InjectMocks, потому что ваш опциональный не будет известен как mockito. Вы должны создать свой сервис A самостоятельно. Как то так:

@RunWith(MockitoJUnitRunner.class)
public class ATest {
    @Mock
    private B b;

    private A a;

    @Before
    public void setup() {
        a = new A(Optional.of(b));
    }
}
0 голосов
/ 26 февраля 2020

Хотя Ответ Lino выше работает отлично, я решил не изменять производственный код, чтобы тест работал. Вместо этого я изменил свой код, как показано ниже:

@Service
public class A {

    @Autowired(required = false)
    private B b;
    ...
    ...
}
0 голосов
/ 25 февраля 2020

На самом деле вы должны смоделировать фактический боб, используя класс @MockBean или @MockBeans или TestConfig, и автоматически соединить Optional с бобовым

@Autowired
private Optional<B> OptionalB;

@MockBean
private B b;
...