Как издеваться над введенным компонентом в Mockito?

#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, в нем будет объяснено, как его следует использовать. Или просто прочитайте Javadoc InjectMocks там это тоже объясняется.

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 .