Bird
Raised Fist0
JUnittesting~5 mins

Object Mother pattern in JUnit

Choose your learning style10 modes available
Introduction

The Object Mother pattern helps create test objects easily and clearly. It avoids repeating code when making objects for tests.

When you need many test objects with similar data in different tests.
When creating test objects is complex and you want to keep tests simple.
When you want to avoid repeating object setup code in multiple test methods.
When you want to improve readability by naming common test objects clearly.
Syntax
JUnit
public class ObjectMother {
    public static YourObject createDefault() {
        return new YourObject("default", 1);
    }

    public static YourObject createWithName(String name) {
        return new YourObject(name, 1);
    }
}

Use static methods to create and return test objects.

Name methods clearly to describe the kind of test object they create.

Examples
This example shows two methods creating different User objects for tests.
JUnit
public class UserMother {
    public static User createDefaultUser() {
        return new User("Alice", 30);
    }

    public static User createTeenUser() {
        return new User("Bob", 15);
    }
}
Using the Object Mother to get a default user in a test.
JUnit
User user = UserMother.createDefaultUser();
assertEquals("Alice", user.getName());
Sample Program

This test class uses the Object Mother pattern to get User objects for tests. It checks the name and age without repeating object creation code.

JUnit
import static org.junit.jupiter.api.Assertions.*;
import org.junit.jupiter.api.Test;

class User {
    private String name;
    private int age;

    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }
}

class UserMother {
    public static User createDefaultUser() {
        return new User("Alice", 30);
    }

    public static User createTeenUser() {
        return new User("Bob", 15);
    }
}

public class UserTest {
    @Test
    void testDefaultUserName() {
        User user = UserMother.createDefaultUser();
        assertEquals("Alice", user.getName());
    }

    @Test
    void testTeenUserAge() {
        User teen = UserMother.createTeenUser();
        assertTrue(teen.getAge() < 20);
    }
}
OutputSuccess
Important Notes

Object Mother helps keep tests clean and easy to read.

Do not put test logic in Object Mother methods; only create objects.

Use descriptive method names to clarify what kind of object is created.

Summary

Object Mother creates ready-to-use test objects.

It reduces repeated setup code in tests.

Helps tests stay simple and clear.

Practice

(1/5)
1. What is the main purpose of the Object Mother pattern in JUnit testing?
easy
A. To generate random test data dynamically
B. To create reusable test objects to reduce setup code
C. To mock external services during tests
D. To organize test cases into groups

Solution

  1. Step 1: Understand Object Mother role

    The Object Mother pattern provides ready-made objects for tests to avoid repeating setup code.
  2. Step 2: Compare with other options

    Mocking services or grouping tests are different patterns; Object Mother focuses on reusable test objects.
  3. Final Answer:

    To create reusable test objects to reduce setup code -> Option B
  4. Quick Check:

    Object Mother = reusable test objects [OK]
Hint: Object Mother = reusable test objects for simpler tests [OK]
Common Mistakes:
  • Confusing Object Mother with mocking frameworks
  • Thinking it generates random data automatically
  • Believing it organizes test suites
2. Which of the following is the correct way to define an Object Mother method in JUnit for a User object?
easy
A. public User createUser() { return new User("Alice", 30); }
B. User createUser() { return new User("Alice", 30); }
C. public static User createUser() { return new User("Alice", 30); }
D. static User createUser() { return new User("Alice", 30); }

Solution

  1. Step 1: Check method signature for Object Mother

    Object Mother methods are usually public static so tests can call them without creating an instance.
  2. Step 2: Validate return type and body

    The method returns a new User object with fixed data, matching the pattern.
  3. Final Answer:

    public static User createUser() { return new User("Alice", 30); } -> Option C
  4. Quick Check:

    Object Mother methods are public static [OK]
Hint: Object Mother methods are public static for easy reuse [OK]
Common Mistakes:
  • Omitting static keyword
  • Using non-public access modifier
  • Missing return type
3. Given this Object Mother method:
public static Order createOrder() {
    return new Order("123", 5, 100.0);
}

What will be the output of this test?
@Test
void testOrderTotal() {
    Order order = ObjectMother.createOrder();
    assertEquals(500.0, order.getTotal());
}
medium
A. Test passes because total is 500.0
B. Test fails because total is 100.0
C. Test fails due to NullPointerException
D. Test fails because order ID is incorrect

Solution

  1. Step 1: Calculate expected total from Object Mother data

    Order has quantity 5 and price 100.0, so total = 5 * 100.0 = 500.0.
  2. Step 2: Check assertion in test

    The test asserts total equals 500.0, which matches the calculated total.
  3. Final Answer:

    Test passes because total is 500.0 -> Option A
  4. Quick Check:

    Quantity * Price = Total = 500.0 [OK]
Hint: Multiply quantity and price to find total [OK]
Common Mistakes:
  • Assuming total is price only
  • Ignoring quantity in calculation
  • Expecting NullPointerException without cause
4. Identify the error in this Object Mother method:
public static Product createProduct() {
    Product p = new Product();
    p.setName("Laptop");
    return p;
    p.setPrice(1200);
}
medium
A. Code after return statement is unreachable
B. Missing static keyword in method
C. Product constructor requires parameters
D. Method should return void

Solution

  1. Step 1: Analyze method flow

    The return p; line ends the method, so code after it is unreachable.
  2. Step 2: Identify unreachable code

    The line p.setPrice(1200); after return will never run, causing a compile warning or error.
  3. Final Answer:

    Code after return statement is unreachable -> Option A
  4. Quick Check:

    Code after return is unreachable [OK]
Hint: No code runs after return statement [OK]
Common Mistakes:
  • Ignoring unreachable code warnings
  • Assuming method can run code after return
  • Confusing method return type
5. You have multiple tests needing different User objects: one active, one inactive, and one admin. How should you design your Object Mother class to best support this?
hard
A. Use a mocking framework instead of Object Mother
B. Create one method createUser(String type) with if-else inside
C. Create User objects directly in each test without Object Mother
D. Create separate static methods: activeUser(), inactiveUser(), adminUser()

Solution

  1. Step 1: Understand Object Mother best practice

    Separate static methods for each test object type keep tests clear and Object Mother simple.
  2. Step 2: Compare alternatives

    Using one method with if-else adds complexity; creating objects in tests repeats code; mocking is different purpose.
  3. Final Answer:

    Create separate static methods: activeUser(), inactiveUser(), adminUser() -> Option D
  4. Quick Check:

    Separate methods = clear reusable objects [OK]
Hint: Use separate methods for each test object type [OK]
Common Mistakes:
  • Overloading one method with many conditions
  • Not using Object Mother and repeating code
  • Confusing mocking with object creation
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