#java #jakarta-ee #junit #mockito #ejb
#java — язык #джакарта-ee #юнит #mockito #ejb #java #junit
Вопрос:
Этот тест работает:
@RunWith(MockitoJUnitRunner.class)
public class Test1 {
@InjectMocks private MyBean bean;
@Test
public void shouldWork() {
bean.test("ABC");
}
}
@Stateless
public class MyBean {
public String test(String s) {
System.out.println("This is a test " s);
return s;
}
}
Теперь я хочу внедрить новый EJB MyBean2 в MyBean и повторно протестировать. Чтобы сделать это, я также издеваюсь над MyBean2 в Test1. Это новый тест:
@RunWith(MockitoJUnitRunner.class)
public class Test1 {
@Mock MyBean2 bean2;
@InjectMocks MyBean bean;
@Test
public void shouldWork() {
bean.test("ABC");
}
}
@Stateless
public class MyBean {
@Inject
MyBean2 bean2;
public String test(String s) {
return s bean2.test2();
}
}
@Stateless
public class MyBean2 {
public String test2() {
return "DEF";
}
}
Но когда я запускаю это, я получаю NullPointerException
когда bean пытается вызвать метод bean2, вероятно, потому, что Mockito не распознает внедренный компонент как EJB.
Как заставить это работать?
Комментарии:
1. Как вы думаете, почему
@InjectMocks
создает mocks? Просто найдите простое руководство по mockito, в нем будет объяснено, как его следует использовать. Или просто прочитайте JavadocInjectMocks
там это тоже объясняется.2. Я не смог найти эту информацию в руководстве по Mockito, можете ли вы указать мне ссылку, где объясняется, как имитировать внедренные EJBS?
3. Например: journaldev.com/21887 /…
4. Единственное отличие в этой статье заключается в том, что
@InjectMocks MyBean2 bean2;
пришлось заменить на@Mock MyBean2 bean2;
, но я все еще получаю NPE 🙂5. Ну, очевидно. Вы все еще пытаетесь издеваться
MyBean
, хотя класс ожидаетMyBean2
. Какого другого результата вы ожидаете здесь?
Ответ №1:
Взгляните на Javadoc @InjectMocks
. В нем говорится, что вы должны вызвать инициализацию используемых макетов, вызвав в вашем случае:
@RunWith(MockitoJUnitRunner.class)
public class Test1 {
@InjectMocks
MyBean bean;
@Mock
MyBean2 bean2;
@Before
public void init() {
MockitoAnnotations.initMocks(this);
}
@Test
public void shouldWork() {
when(bean2.test2()).thenReturn("mocked return");
assertThat(bean.test("ABC")).isEqualTo("ABCmocked return");
}
}
Комментарии:
1. Спасибо, но я все еще получаю,
NullPointerException
поскольку bean2 равен нулю в MyBean.2. Да, мой первый ответ касался только инициализации
@Mock
объектов. Теперь я обновил его, показав вам также, что, конечно, все еще необходимо смоделировать вызов вашего методаbean2
.