@MockBean возвращает нулевой объект

avatar
bhavya
9 августа 2021 в 05:39
1242
1
2

Я пытаюсь использовать @MockBean; java версии 11, версии Spring Framework (5.3.8), версии Spring Boot (2.5.1) и Junit Jupiter (5.7.2).

    @SpringBootTest
    public class PostEventHandlerTest {
        @MockBean
        private AttachmentService attachmentService;

        @Test
        public void handlePostBeforeCreateTest() throws Exception {
            Post post = new Post("First Post", "Post Added", null, null, "", "");
            
            Mockito.when(attachmentService.storeFile("abc.txt", "")).thenReturn(new Attachment());
     
            PostEventHandler postEventHandler = new PostEventHandler();
            postEventHandler.handlePostBeforeCreate(post);
            verify(attachmentService, times(1)).storeFile("abc.txt", "");
       }
    }
    @Slf4j
    @Component
    @Configuration
    @RepositoryEventHandler
    public class PostEventHandler {
           @Autowired
           private AttachmentService attachmentService;

           @Autowired
           private PostRepository postRepository;

           public void handlePostBeforeCreate(Post post) throws Exception {
             ...
             /* Here attachmentService is found null when we execute above test*/
             attachmentService.storeFile(fileName, content);
             ...
           }
    }

attachmentService не имитируется, он возвращает null

Источник
johanneslink
9 августа 2021 в 16:41
0

Как предполагаемая служба вложений может попасть в ваш postEventHandler? Вы должны использовать механизмы Spring для создания обработчика, иначе он не сможет внедрить макеты в соответствующих местах.

Ответы (1)

avatar
Mark Bramnik
9 августа 2021 в 05:49
5

Думаю, вы неправильно понимаете использование Mocks.

Это правда, что @MockBean создает макет (внутренне использует Mockito) и помещает этот компонент в контекст приложения, чтобы он был доступен для инъекций и т. д.

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

Итак, если ваш AttachementService имеет метод String foo(int):

public interface AttachementService { // or class 
   public String foo(int i);
}

Вы должны указать ожидания с помощью Mockito API:

    @Test
    public void handlePostBeforeCreateTest() throws Exception { 
        // note this line, its crucial
        Mockito.when(attachmentService.foo(123)).thenReturn("Hello");

        Post post = new Post("First Post", "Post Added", null, null, "", "");
        PostEventHandler postEventHandler = new PostEventHandler();
        postEventHandler.handlePostBeforeCreate(post);
        verify(attachmentService, times(1)).storeFile("", null);
   }

Если вы не укажете ожидание и ваш тестируемый код вызовет foo в какой-то момент, этот вызов метода вернет null

bhavya
9 августа 2021 в 10:54
1

Даже после добавления строки выше; attachmentService имеет значение null внутри handlePostBeforeCreate, когда я запускаю testCase