Dependency injection practice and unit test - Tuong-Nguyen/Spring GitHub Wiki

Dependency Injection

Two ways, via:

  • Constructor
  • A setter

Dependency Injection in Spring

Sample

Class Diagram

Writer class diagram

Implement

Create classes and interface to package spitter.web.services (/src/main/java/spitter/web/services folder)

  • IWriter
  • Writer
  • NiceWriter
  • WriterRunner

Ref: http://www.vogella.com/tutorials/SpringDependencyInjection/article.html

Unit test

Setup

Use junit, spring-test and mockito. Download libraries from Maven, update pom.xml

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>4.3.8.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.mockito</groupId>
            <artifactId>mockito-all</artifactId>
            <version>1.9.5</version>
        </dependency>

Test

  • Create test package spitter.web.services (/src/test/java/spitter/web/services folder)
  • Create test class for WriterRunner

Steps to auto wiring and test dependency injection

  • Create dependent and independent classes with @Component annotation

They are considered as candidates for auto detection when using configuration annotations and class-path scanning.

@Component
public class WriterRunner { ... }
@Component
public class Writer implements IWriter { ... }
  • Add @Autowired to constructor or field or setter of dependent class

They will be autowired by Spring's DI facilities

    @Autowired
    public WriterRunner(IWriter writer) {
        this.writer = writer;
    }
    @Autowired
    public void setWriter(IWriter writer) { this.writer = writer; }
  • Bootstrapping @Configuration, the classes may be processed by Spring container to generate beans.
    • Use @Import

    Defining the classes will be used, they no need marked as @Component

       @Configuration
       @Import({Writer.class, WriterRunner.class})
       public class WriterConfig {
       }
    • Use @ComponentScan

    Scanning all class marked as component in a package

       @Configuration
       @ComponentScan("spitter.web.services")
       public class WriterConfig {
       }
  • Unit test class must be:
    • Run with Spring's runner
    • Set context configuration
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes=WriterConfig.class)
public class WriterRunnerAutoWiredTest {
⚠️ **GitHub.com Fallback** ⚠️