Bird
Raised Fist0
Spring Bootframework~20 mins

Field injection and why to avoid it in Spring Boot - Practice Problems & Coding Challenges

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
Field Injection Mastery
Get all challenges correct to earn this badge!
Test your skills under time pressure!
🧠 Conceptual
intermediate
2:00remaining
Why is field injection discouraged in Spring Boot?
Which of the following is the main reason developers are advised to avoid field injection in Spring Boot?
AField injection automatically validates dependencies at compile time, preventing runtime errors.
BField injection improves code readability and is recommended for all Spring Boot projects.
CField injection makes unit testing harder because dependencies are private and cannot be set easily.
DField injection allows dependencies to be changed dynamically at runtime without restarting the application.
Attempts:
2 left
💡 Hint
Think about how private fields affect testing and flexibility.
❓ component_behavior
intermediate
2:00remaining
What happens when a Spring component uses field injection?
Consider a Spring component with a private field annotated with @Autowired for dependency injection. What is the behavior when the application context starts?
ASpring calls the constructor with the dependency as a parameter to inject it.
BSpring requires a setter method to inject the dependency into the private field.
CSpring throws a compile-time error because private fields cannot be injected.
DSpring injects the dependency directly into the private field using reflection after the object is created.
Attempts:
2 left
💡 Hint
Think about how Spring accesses private fields.
🔧 Debug
advanced
2:00remaining
Why does this Spring Boot test fail with field injection?
Given this Spring Boot test class using field injection, why does the test fail with a NullPointerException? public class UserServiceTest { @Autowired private UserRepository userRepository; @Test public void testFindUser() { User user = userRepository.findById(1L); assertNotNull(user); } }
AField injection requires the userRepository field to be public for injection to work.
BThe test class is missing @ExtendWith(SpringExtension.class) or @SpringBootTest, so Spring does not inject dependencies.
CThe UserRepository bean is not annotated with @Component, so Spring cannot inject it.
DThe test method must be static for Spring to inject dependencies.
Attempts:
2 left
💡 Hint
Check if Spring context is loaded for the test.
📝 Syntax
advanced
2:00remaining
Which code snippet correctly uses constructor injection in Spring Boot?
Select the code snippet that correctly implements constructor injection for a service class in Spring Boot.
A
public class OrderService {
  private final PaymentService paymentService;

  @Autowired
  public OrderService(PaymentService paymentService) {
    this.paymentService = paymentService;
  }
}
B
public class OrderService {
  private PaymentService paymentService;

  public void setPaymentService(PaymentService paymentService) {
    this.paymentService = paymentService;
  }
}
C
public class OrderService {
  private PaymentService paymentService;

  public OrderService() {
    this.paymentService = new PaymentService();
  }
}
D
public class OrderService {
  @Autowired
  private PaymentService paymentService;
}
Attempts:
2 left
💡 Hint
Constructor injection requires a constructor with parameters and @Autowired.
❓ state_output
expert
2:00remaining
What is the state of the dependency in this Spring Boot component using field injection?
Given this Spring Boot component: @Component public class NotificationService { @Autowired private EmailService emailService; public void sendNotification() { emailService.sendEmail("Hello"); } } What happens if you create NotificationService with new NotificationService() and call sendNotification()?
AA NullPointerException occurs because emailService is not injected when using new operator.
BThe emailService is injected automatically even when using new operator, so the email is sent.
CThe code compiles but sendNotification() does nothing because emailService is empty.
DSpring throws a runtime error when new NotificationService() is called.
Attempts:
2 left
💡 Hint
Think about how Spring manages injection and object creation.

Practice

(1/5)
1. What is a main reason to avoid using @Autowired directly on fields in Spring Boot?
easy
A. It disables Spring Boot auto-configuration
B. It causes syntax errors in the code
C. It requires manual object creation
D. It hides dependencies and makes testing harder

Solution

  1. Step 1: Understand field injection behavior

    Field injection uses @Autowired on fields, which hides the dependencies inside the class without showing them in the constructor.
  2. Step 2: Analyze impact on testing

    Because dependencies are hidden, it becomes harder to create test instances with mocks or stubs, reducing testability.
  3. Final Answer:

    It hides dependencies and makes testing harder -> Option D
  4. Quick Check:

    Hidden dependencies = avoid field injection [OK]
Hint: Hidden dependencies make testing tough, avoid field injection [OK]
Common Mistakes:
  • Thinking field injection causes syntax errors
  • Believing field injection disables auto-configuration
  • Assuming field injection requires manual object creation
2. Which of the following is the correct way to inject a dependency using constructor injection in Spring Boot?
easy
A. @Autowired private Service service;
B. Service service = new Service();
C. public MyClass(Service service) { this.service = service; }
D. @Autowired public void setService(Service service) { this.service = service; }

Solution

  1. Step 1: Identify constructor injection syntax

    Constructor injection requires a constructor that accepts the dependency as a parameter and assigns it to a field.
  2. Step 2: Match the correct code

    public MyClass(Service service) { this.service = service; } shows a constructor receiving Service and assigning it, which is the correct pattern.
  3. Final Answer:

    public MyClass(Service service) { this.service = service; } -> Option C
  4. Quick Check:

    Constructor injection = constructor with parameters [OK]
Hint: Constructor injection uses constructor parameters, not field annotations [OK]
Common Mistakes:
  • Confusing field injection with constructor injection
  • Using manual object creation instead of injection
  • Using setter injection when constructor injection is asked
3. Given this Spring Boot class using field injection:
public class MyService {
  @Autowired
  private Repository repo;

  public String getData() {
    return repo.fetch();
  }
}

What is a likely problem when writing unit tests for MyService?
medium
A. The getData() method will not compile
B. You cannot replace repo with a mock easily
C. The repo field will always be null at runtime
D. Spring Boot will throw a runtime exception on startup

Solution

  1. Step 1: Understand field injection impact on testing

    Field injection hides the dependency inside the private field, making it hard to inject a mock instance during unit tests.
  2. Step 2: Analyze testability of MyService

    Since repo is private and injected by Spring, test code cannot easily replace it with a mock, limiting test control.
  3. Final Answer:

    You cannot replace repo with a mock easily -> Option B
  4. Quick Check:

    Field injection blocks mock replacement [OK]
Hint: Field injection hides fields, blocking mock injection in tests [OK]
Common Mistakes:
  • Assuming compilation errors occur
  • Thinking Spring throws exceptions on field injection
  • Believing the field is always null at runtime
4. Identify the problem in this Spring Boot class using field injection:
public class UserService {
  @Autowired
  private UserRepository userRepository;

  public UserService() {}

  public User findUser(Long id) {
    return userRepository.findById(id).orElse(null);
  }
}
medium
A. Field injection hides dependencies making testing harder
B. Constructor is missing the @Autowired annotation
C. The userRepository field should be static
D. The findUser method should be static

Solution

  1. Step 1: Review injection style

    The class uses field injection with @Autowired on a private field, which hides dependencies.
  2. Step 2: Understand testing impact

    Because dependencies are hidden, it is harder to inject mocks or stubs for unit testing, reducing testability.
  3. Final Answer:

    Field injection hides dependencies making testing harder -> Option A
  4. Quick Check:

    Field injection = hidden dependencies = testing difficulty [OK]
Hint: Field injection hides dependencies, causing test problems [OK]
Common Mistakes:
  • Thinking constructor needs @Autowired always
  • Believing fields must be static for injection
  • Assuming methods must be static for injection
5. You have a Spring Boot service class that uses field injection:
public class OrderService {
  @Autowired
  private PaymentService paymentService;

  public boolean processOrder(Order order) {
    return paymentService.charge(order.getAmount());
  }
}

How would switching to constructor injection improve this class?
hard
A. It makes dependencies explicit and improves testability
B. It removes the need to annotate fields with @Autowired
C. It automatically creates new instances of dependencies
D. It allows Spring to inject dependencies without a constructor

Solution

  1. Step 1: Understand constructor injection benefits

    Constructor injection requires dependencies to be passed in explicitly, making them visible and clear in the class design.
  2. Step 2: Analyze testability improvements

    Explicit dependencies allow easy replacement with mocks or stubs during testing, improving testability and code clarity.
  3. Final Answer:

    It makes dependencies explicit and improves testability -> Option A
  4. Quick Check:

    Constructor injection = explicit dependencies + better tests [OK]
Hint: Constructor injection shows dependencies clearly, aiding tests [OK]
Common Mistakes:
  • Thinking constructor injection removes @Autowired completely
  • Believing constructor injection creates new instances automatically
  • Assuming Spring injects without constructor or annotations
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard