[JAVA] Résumons pourquoi l'injection de constructeur est recommandée

Injection de constructeur et injection de champ

Avantages et inconvénients de l'injection sur le terrain

Exemple d'implémentation avec injection de champ


@Service
public class BookService{
    
    @Autowired
    private BookDao bookDao;
    
    @Autowired
    private HogeDao hogeDao;

    /**
     *Renvoie un livre qui correspond à l'argument bookId
     */
    public Book selectById(int bookId){
        Optional<Book> wrappedBook = bookDao.findById(bookId);
        return wrappedBook.orElseThrow(() -> NotFoundException("Non"));
    }
                          .
                          .
                          .
}

Avantages et inconvénients de l'injection constructeur

Exemple d'implémentation avec injection de constructeur

@Service
public class BookService{
    private final BookDao bookDao;
    private final HogeDao hogeDao;
    
    @Autowired // → Spring4.Cette annotation peut être omise si elle est égale ou supérieure à 3
    public BookService(BookDao bookDao, HogeDao hogeDao){
        this.bookDao = bookdao;
        this.hogeDao = hogedao;
    }

    /**
     *Renvoie un livre qui correspond à l'argument bookId
     */
    public Book selectById(int bookId){
        Optional<Book> wrappedBook = bookDao.findById(bookId);
        return wrappedBook.orElseThrow(() -> NotFoundException("Non"));
    }
                          .
                          .
                          .
}

Testabilité améliorée par injection de constructeur

Lors du test d'une classe implémentée avec l'injection de champ

@RunWith(SpringRunner.class)
@SpringBootTest
public class BookServiceTests{

    @Autowired    
    private BookService bookService;

    @MockBean
    private BookDao bookDao;

    @MockBean
    private HogeDao hogeDao;

 
    @Test
public void Possibilité d'obtenir des livres avec l'ID de livre spécifié(){
        // setUp
        var expected = new Book(1, "Nom du livre"); 
        when(bookDao.findById(1)).thenReturn(expected);
        var bookService = new BookService();

        // execute
        var actual = bookService.selectById(1);

        // verify
        assertThat(...Omis ci-dessous
    }
}

Lors du test d'une classe implémentée par injection de constructeur


public class BookServiceTests{ 
    private BookService bookService;
    private BookDao bookDao;
    private HogeDao hogeDao;

    @Before
    public void setUp(){
        bookDao = Mockito.mock(BookDao.class);
        hogeDao = Mockito.mock(HogeDao.class);
        bookService = new BookService(bookDao, hogeDao);
    }
 
    @Test
public void Possibilité d'obtenir des livres avec l'ID de livre spécifié(){
        // setUp
        var expected = new Book(1, "Nom du livre"); 
        when(bookDao.findById(1)).thenReturn(expected);
        var bookService = new BookService();

        // execute
        var actual = bookService.selectById(1);

        // verify
        assertThat(...Omis ci-dessous
    }
}

@RunWith(MockitoJUnitRunner.class)
public class BookServiceTests{ 
    private BookService bookService;

    @Mock
    private BookDao bookDao;
    @Mock
    private HogeDao hogeDao;

    @Before
    public void setUp(){
        bookService = new BookService(bookDao, hogeDao);
    }
    //Omis ci-dessous

référence

Recommended Posts

Résumons pourquoi l'injection de constructeur est recommandée
A quoi sert le constructeur?
Spring Autowired est écrit dans le constructeur
Qu'est-ce que JSP? ~ Connaissons les bases de JSP !! ~
Le silence d'exception est le pire (pourquoi le programmeur fait taire l'exception?)