[JAVA] Lassen Sie uns zusammenfassen, warum eine Konstruktorinjektion empfohlen wird

Konstruktorinjektion und Feldinjektion

Vor- und Nachteile der Feldinjektion

Implementierungsbeispiel mit Feldinjektion


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

    /**
     *Gibt ein Buch zurück, das dem Argument bookId entspricht
     */
    public Book selectById(int bookId){
        Optional<Book> wrappedBook = bookDao.findById(bookId);
        return wrappedBook.orElseThrow(() -> NotFoundException("Nein"));
    }
                          .
                          .
                          .
}

Vor- und Nachteile der Konstruktorinjektion

Implementierungsbeispiel mit Konstruktorinjektion

@Service
public class BookService{
    private final BookDao bookDao;
    private final HogeDao hogeDao;
    
    @Autowired // → Spring4.Diese Anmerkung kann weggelassen werden, wenn sie 3 oder mehr beträgt
    public BookService(BookDao bookDao, HogeDao hogeDao){
        this.bookDao = bookdao;
        this.hogeDao = hogedao;
    }

    /**
     *Gibt ein Buch zurück, das dem Argument bookId entspricht
     */
    public Book selectById(int bookId){
        Optional<Book> wrappedBook = bookDao.findById(bookId);
        return wrappedBook.orElseThrow(() -> NotFoundException("Nein"));
    }
                          .
                          .
                          .
}

Verbesserte Testbarkeit durch Konstruktorinjektion

Beim Testen einer Klasse, die mit Feldinjektion implementiert wurde

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

    @Autowired    
    private BookService bookService;

    @MockBean
    private BookDao bookDao;

    @MockBean
    private HogeDao hogeDao;

 
    @Test
public void Bücher mit der angegebenen bookId abrufen können(){
        // setUp
        var expected = new Book(1, "Buchname"); 
        when(bookDao.findById(1)).thenReturn(expected);
        var bookService = new BookService();

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

        // verify
        assertThat(...Unten weggelassen
    }
}

Beim Testen einer durch Konstruktorinjektion implementierten Klasse


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 Bücher mit der angegebenen bookId abrufen können(){
        // setUp
        var expected = new Book(1, "Buchname"); 
        when(bookDao.findById(1)).thenReturn(expected);
        var bookService = new BookService();

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

        // verify
        assertThat(...Unten weggelassen
    }
}

@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);
    }
    //Unten weggelassen

Referenz

Recommended Posts

Lassen Sie uns zusammenfassen, warum eine Konstruktorinjektion empfohlen wird
Wofür ist der Konstruktor?
Spring Autowired wird im Konstruktor geschrieben
Was ist JSP? ~ Lassen Sie uns die Grundlagen von JSP kennen !! ~
Ausnahmestille ist die schlimmste (warum bringt der Programmierer Ausnahme aus?)